我有一个基类,它有虚函数void function1(),并在派生类中被重写。另外,在我的派生类中还有一个虚函数,如下所示。
class Base
{
public:
virtual void function1()
{
cout<<"Base::Virtual function1"<<endl;
}
};
class Derived1:public Base
{
public:
void function1()
{
cout<<"Derived1::Function1"<<endl;
}
virtual void function2()
{
cout<<"Derived1::function2"<<endl;
}
};
int main()
{
Base *bptr = new Derived1();
Derived1 *dptr = new Derived2();
bptr->function2(); //compile time error
return 0;
}
我想知道在编译时会发生什么,这会导致编译时错误。我想在面试的角度来回答一个问题。 Vtable和Vptr在这种情况下的表现如何?我知道将有一个基类的vptr,它将继承到Derived1类。编译器在编译时检查什么?
在基类qazxsw poi你没有虚拟qazxsw poi,所以如果你使用“Base”作为类型编译器找不到Base
。
改成:
function2
你可以使用function2。由于您没有Derived2,因此还有另一个错误
编译器不跟踪bptr的运行时类型,而是始终将其视为指向Base的实例。您必须在Base中声明function2以便编译器确认它。另外,Derived中的function1不应该在基类中声明为虚拟吗?