Gia*_*tta 13 c++ virtual-functions multiple-inheritance
我有一个没有虚拟基类的多继承场景,如下所示:
Ta Tb
| |
B C
\ /
A
Run Code Online (Sandbox Code Playgroud)
Ta和Tb是两个不同的模板类,它们都声明了一个名为f()的虚函数.我想覆盖A范围中的两个函数,因为我必须在这些方法中与B和C数据进行交互.但我不知道该怎么做.
class Tb {
protected:
virtual void f() {};
public:
void call() {
this->f();
};
};
class Tc {
protected:
virtual void f() {};
public:
void call() {
this->f();
};
};
class B : public Tb {
public:
void doSomething() {};
};
class C : public Tc {
private:
int c;
public:
void inc() { c++; };
};
class A : public B, public C {
protected:
void f() { // this is legal but I don't want to override both with the same definition.
// code here
}
// if Tb::f() is called then i want to call C::inc()
// if Tc::f() is called then i want to call B::doSomething()
public:
void call() {
B::call();
C::call();
};
};
Run Code Online (Sandbox Code Playgroud)
是否有语法覆盖具有不同定义的方法或者我必须在B和C中定义这些方法吗?
谢谢
编辑:我的问题不是一个不能调用Tb :: f()或Tc :: f(),但我想要定义两个不同的行为,如果调用Tb :: f()或Tc :: f().这些方法由Tb和Tc本身在其自己的公共方法中调用.修改了这个例子,所以也许更清楚我想做什么......
是否有语法覆盖具有不同定义的方法或者我必须在B和C中定义这些方法吗?
简答:不.
你的A:f()意志会覆盖Ta::f()和Tb::f().
如果你想要不同的覆盖,唯一的解决方案是插入辅助类Hb和Hc:
Ta Tb
| |
B C
| |
Hb Hc
\ /
A
Run Code Online (Sandbox Code Playgroud)
Hb 可以小到两个函数,只需重命名函数:
class Hb: public B {
protected: // overrides from Ta
virtual void f() { Ta_f(); }
protected: // new virtuals
virtual void Ta_f() = 0;
};
Run Code Online (Sandbox Code Playgroud)
然后你可以定义A::Ta_f()做任何你想做的事情(包括调用B::f()!)
小智 3
你确实在课堂上覆盖了两者A。如果不这样做,就会出现歧义,除非using使用指令来明确指定您喜欢的方法。
您可以在B和C类中分别重写这些方法,但同样,一旦A类继承了这两个方法,您就必须决定应该使用哪一个。