У меня есть пример кода:
class A
{
public:
virtual void func1();
virtual void func2();
};
class B
{
public:
virtual void func2();
virtual void func3();
};
void main()
{
A *obj = new B;
obj->func3();
}
Почему линия obj->func3();
вернуть ошибку?
(мы знаем, что для каждого класса создается отдельная виртуальная таблица)
Так как obj
это указатель на A
, A
не имеет func3
на это, так что вы не можете назвать это.
Примечание: я предположил, что вы на самом деле хотели наследовать B
от A
— это будет ошибка перед вызовом, при назначении в текущем состоянии.
Это никак не может сработать. Рассматривать:
Class B : public A
{
void Foo (int);
};
class C : public A
{
void Foo (char);
};
class D : public A
{
void Foo (double);
}
void bar (A* obj)
{
obj->Foo (1); // Uh oh!
}
Как компилятор может знать, какой код генерировать? Должно ли это передать целое число? Поплавок? Характер?
И это никогда не безопасно, потому что компилятор не может видеть определения всех производных классов, когда он компилирует такие функции, как bar
,
Если вы хотите вызывать функцию через указатели на базовый класс, базовый класс должен как минимум определить, какие параметры принимает эта функция.
Ваш код должен выглядеть следующим образом, если он должен работать. Вам нужно объявить функцию в базовом классе, иначе в vtable для func3 () ее пространство не будет выделено в базовом классе.
class A
{
public:
virtual void func1();
virtual void func2();
virtual void func3(); //virtual function , linking at run time depends on what object it points to
};
class B : public A //public inheritance
{
public:
virtual void func2();
virtual void func3();
};
void main()
{
A *obj = new B; //base class pointer pointing to derived class object
obj->func3(); //since func3() is declared as virtual , dynamic linking takes place and since at
// run times it points to object b , function in class B is invoked
}