class base {
public:
int foo();
int foo(int a);
int foo(char* b);
int doSomething(int);
}
class derived : public base
{
public:
int doSomething(int b);
}
int derived::doSomething( int b)
{
base::doSomething(b);
//Make Something else
}
int main()
{
derived d= new derived();
d->foo();
}
Теперь в методе foo (любом из них) я хочу вызвать более конкретный doSomething. если я создаю экземпляр производного класса, мне нужен doSomething производного класса, и если я создаю экземпляр базового класса, мне нужен doSomething базового класса, несмотря на то, что я вызываю из метода foo, реализованного в базовом классе.
int base::foo()
{
//do something
makeSomething(5);
}
3 ответа
В своем базовом классе сделайте метод doSomething виртуальным:
public:
virtual int doSomething(int);
Тогда ты можешь:
Base* deriv = new Derived();
Base* base = new Base();
deriv->doSomething();
base->doSomething();
И наслаждаться!
Вот для чего нужны виртуальные функции:
struct A {
virtual ~A() {}
virtual void f() {}
};
struct B : A {
void f() {}
};
// ...
A* a = new A;
A* b = new B;
a->f(); // calls A::f
b->f(); // calls B::f
содержит некоторые подробности, но не может замените хорошую вводной книгой.
Я бы предложил этот пример, чтобы проиллюстрировать разницу между использованием виртуальных и неиспользуемых
struct A {
virtual ~A() {}
virtual void f() {}
void g() {}
};
struct B : A {
void f() {}
void g() {}
};
A* a = new A;
A* b = new B;
a->f(); // calls A::f
b->f(); // calls B::f
b->g(); // calls A::g
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
virtual
.