C++ 基类中的abc接口继承和重新公开方法
我很好奇,在派生接口的基类中是否有一种简洁的方法公开方法 因此,在代码中:-C++ 基类中的abc接口继承和重新公开方法,c++,inheritance,C++,Inheritance,我很好奇,在派生接口的基类中是否有一种简洁的方法公开方法 因此,在代码中:- class cbase { public: void MyMethodA() { } }; class cderived : public cbase { public: void MyMethodB() { } } class ibase { public: virtual void MyMethodA() = 0; }; class iderived : public ibase { public
class cbase {
public:
void MyMethodA() { }
};
class cderived : public cbase {
public:
void MyMethodB() { }
}
class ibase {
public:
virtual void MyMethodA() = 0;
};
class iderived : public ibase {
public:
virtual void MyMethodB() = 0;
};
现在,如果我让cbase继承ibase,而cderived实现iderived,编译器会抱怨当我实例化cderived时,MyMethodA()是抽象的,没有实现
MyMethodA()在基类中通过ibase实现。修复此问题的唯一方法是在cderived类中重新实现ibase的方法吗?如果是这样的话,真恶心
详情如下:-
class cbase : public ibase {
public:
void MyMethodA() { }
};
class cderived : public cbase, public iderived {
public:
void MyMethodA() { cbase::MyMethodA(); }
void MyMethodB() { }
};
cderived inst;
iderived *der = &inst;
der->MyMethodA();
der->MyMethodB();
ibase *bas = der;
bas->MyMethodA();
我希望这足以表达这个问题当我们试图重构旧代码时,这听起来可能有点荒谬
我相信有很多热切的评论;) 如果我理解正确,您希望使
ibase
成为iderived
和cbase
的虚拟基类
在类层次结构中,每个接口类只有一个实例,当您在cderived
级别将cbase
和iderived
连接在一起时,会使用cbase
中的MyMethodA
的非虚拟覆盖,因为它是主要覆盖
请看这里:
例如
看一看
该常见问题的答案基本上是对您的问题的回答:
class cderived : public virtual cbase {
public:
void MyMethodB() { }
}
class ibase {
public:
virtual void MyMethodA() = 0;
};
class iderived : public virtual ibase {
public:
virtual void MyMethodB() = 0;
};
iderived和cbase实际上不需要从它们的基类继承,不是吗?@VJo:对不起,我不明白你的问题。哇,所以我忽略了visual-c中的支配警告,而这一切都是假的?我印象深刻:)换句话说:为什么这样:
class-iderived:public-virtual-ibase
?为什么不干脆class-iderived:public-ibase
?@VJo:ibase
实际上是一个接口类。如果在类层次结构的两个点上都不是虚拟基类,那么基类将有两个副本,并且需要在继承树的两个分支中重写MyMethodA
。如果ibase
不是iderived
的虚拟基类,那么cbase
对MyMethodA
的实现就不会是对ibase
副本的覆盖,后者是iderived
的非虚拟基类。我认为问题的关键是找到一种避免实现的方法MyMethodA
的“直通”版本。
class cderived : public virtual cbase {
public:
void MyMethodB() { }
}
class ibase {
public:
virtual void MyMethodA() = 0;
};
class iderived : public virtual ibase {
public:
virtual void MyMethodB() = 0;
};