c++ - 当基类指针指向在基类中声明的派生类虚函数时,为什么会出现编译时错误?
问题描述
我有一个基类,它具有 virtual 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 在这种情况下如何表现。我知道 Base 类将有一个 vptr,它将被继承到 Derived1 类。编译器在编译时检查什么?
解决方案
在基类中Base
你没有 virtual function2
,所以如果你使用“Base”作为类型编译器找不到function2
.
改成:
class Base
{
public:
virtual void function1()
{
cout<<"Base::Virtual function1"<<endl;
}
virtual void function2() = 0;
};
你可以使用function2。还有另一个错误,因为您没有 Derived2
推荐阅读
- android - 如何为私有 RealmList 进行 RealmMigration
android下一个版本的数据列表 - angular - mat-grid-list 和 mat-grid-tile 未按需要对齐
- angular - 如何在 Angular 6 中根据用户输入显示不同的错误消息
- python - 没有互联网连接时停止 python 脚本中止
- android - 如何在 Xamarin Forms Android 中的网络连接更改时收到通知?
- c++ - 使用OpenGL在矩形顶部绘制倒三角形
- javascript - Webpack 文件加载器向 HTML 和 CSS 文件注入相同的 URL
- objective-c - Swift 4,读取字节数据
- visual-studio - 如何将外部 .lib 链接到 Fortran
- browser - 在同一域中使用多个网站图标的问题