Izz*_*zzo 9 c++ virtual inheritance
我正在研究一个简单的C++程序,并且很难理解我遇到的编译器错误.这个问题是由我尝试从基类创建派生类引起的.我在下面发布了相同结构的代码,但更改了名称.
BaseClass.h
#ifndef BASECLASS_H
#define BASECLASS_H
class BaseClass {
public:
BaseClass(void);
virtual int method1(void) = 0;
virtual int method2(void) = 0;
virtual float method3(void) = 0;
};
#endif // BASECLASS_H
Run Code Online (Sandbox Code Playgroud)
DerivedClass.h
#ifndef DERIVEDCLASS_H
#define DERIVEDCLASS_H
#include "DerivedClass.h"
class DerivedClass: public BaseClass
{
public:
DerivedClass(void);
};
#endif // DERIVEDCLASS_H
Run Code Online (Sandbox Code Playgroud)
DerivedClass.cpp
#include "DerivedClass.h"
DerivedClass::DerivedClass(void)
{
}
int DerivedClass::method1(void)
{
// TODO
}
int DerivedClass::method2(void)
{
// TODO
}
float DerivedClass::method3(void)
{
// TODO
}
Run Code Online (Sandbox Code Playgroud)
尝试编译时,我得到所有虚拟方法的以下错误:
no 'int DerivedClass::methodX()' member function declared in class 'DerivedClass'
Run Code Online (Sandbox Code Playgroud)
一旦我在'DerivedClass.h'中声明这些方法,错误就会消失,因为编译器现在知道这些方法.
但是,我很困惑.为什么有必要在DerivedClass.h中重新声明纯虚函数?当我#include DerivedClass.h时,它将自动包含BaseClass.h,因此我假设我的DerivedClass.cpp应该完全了解这些方法.我做错了吗?
krz*_*zaq 11
它没有这种方式.您需要声明要定义的方法,无论它们是否覆盖虚拟方法.
这不仅仅是语言的无理要求.如果没有这个,你就无法定义部分虚拟类,也就是说,你可能有BaseSubtype一个共同的实现,method1()但需要从它派生的类来实现method2()和method3()
当你在派生类中声明一个方法时,你对编译器说:
我想在这个类中覆盖这个方法
所以如果你没有在派生类中声明一个方法,你会说:
我不想覆盖这个方法;派生类的实现与基类中的相同
在您的情况下,基类将它们声明为纯虚拟的,因此在这种情况下可以解释为:
我不想在这个类中实现这个方法
如果你试图定义一个方法而不声明它,你就会自相矛盾。编译器会检测到(以保护您免受自己的疏忽)。
| 归档时间: |
|
| 查看次数: |
4274 次 |
| 最近记录: |