我做了一个测试代码如下:
#include <iostream>
using namespace std;
#ifndef interface
#define interface struct
#endif
interface Base
{
virtual void funcBase() = 0;
};
interface Derived1 : public Base
{
virtual void funcDerived1() = 0;
};
interface Derived2 : public Base
{
virtual void funcDerived2() = 0;
};
interface DDerived : public Derived1, public Derived2
{
virtual void funcDDerived() = 0;
};
class Implementation : public DDerived
{
public:
void funcBase() { cout << "base" << endl; }
void funcDerived1() { cout << "derived1" << endl; }
void funcDerived2() { cout << "derived2" << endl; }
void funcDDerived() { cout << "dderived" << endl; }
};
int main()
{
DDerived *pObject = new Implementation;
pObject->funcBase();
return 0;
}
我写这段代码的原因是为了测试函数 funcBase() 是否可以在 DDerived 的实例中调用。当我尝试编译此代码时,我的 C++ 编译器 (Visual Studio 2010) 给了我一条编译错误消息。在我看来,这段代码没有问题,因为它肯定funcBase()
会在接口的某个派生类中实现(因此被覆盖)DDerived
,因为它是纯虚拟的。换句话说,任何类型的指针变量都Implementation *
应该与派生实现并覆盖函数的类的实例相关联funcBase()
。
我的问题是,为什么编译器会给我这样的错误信息?为什么 C++ 语法是这样定义的;即,将这种情况视为错误?如何使代码运行?我想允许接口的多重继承。当然,如果我使用“虚拟公共”或重新声明funcBase()
该Implementation
功能
interface DDerived : public Derived1, public Derived2
{
virtual void funcBase() = 0;
virtual void funcDDerived() = 0;
};
然后一切运行没有问题。
但是我不想那样做,寻找更方便的方法,因为虚拟继承可能会降低性能,如果类的继承关系非常复杂,重新声明会很繁琐。除了使用虚拟继承之外,还有其他方法可以在 C++ 中启用接口的多重继承吗?