Pas*_* By 5 c++ polymorphism multiple-inheritance
手头的问题很难描述,所以代码放在前面以便更清晰.
struct Base
{
int b;
virtual void foo(){cout << b << endl;}
Base(int x) : b(x){}
};
struct Derived1 : Base //not virtual
{
virtual void foo(){/*Derived2's code*/}
Derived1() : Base(1){}
};
struct Derived2 : Base //not virtual
{
virtual void foo(){/*Derived2's code*/}
Derived2() : Base(2){}
};
struct MultiInheritance : Derived1, Derived2
{
void bar1()
{
//needs to access Derived1's Base foo()
}
void bar2()
{
//needs to access Derived2's Base foo()
}
};
Run Code Online (Sandbox Code Playgroud)
假设在一些奇怪的奇怪场景中,我希望有一个基类MultiInheritance,它有两个基类Derived1,Derived2并且有一个共同的非虚基类Base.
有两个Base在MultiInheritance,我怎么指定Base我希望在访问班MultiInheritance?
上面的代码似乎可以通过多次转换来正常工作,但我不确定这是否是已定义的行为.如果是,编译器如何实现多态性的需求呢?一方面virtual调用应该都导致相同的virtual函数表,但另一方面,如果它发生,它将不会输出不同的答案.
编辑
我想强调的是,这些Base类必须是非虚拟的
EDIT2
深表歉意,我严重歪曲自己.上面的代码更新更好地反映了我原来的问题.
这是一个更具说明性的示例。
#include <iostream>
using namespace std;
template <typename Res, typename Arg>
Res& as(Arg& arg)
{
return arg;
}
struct Base
{
virtual void foo() = 0;
};
struct Derived1 : Base {};
struct Derived2 : Base {};
struct MoreDerived1 : Derived1
{
void foo() { cout << "Derived1\n"; }
};
struct MoreDerived2 : Derived2
{
void foo() { cout << "Derived2\n"; }
};
struct MultiInheritance : MoreDerived1, MoreDerived2
{
void bar1() { as<Derived1>(*this).foo(); }
void bar2() { as<Derived2>(*this).foo(); }
};
int main ()
{
MultiInheritance m;
m.bar1();
m.bar2();
}
Run Code Online (Sandbox Code Playgroud)
这个例子说明:
Derived1::foo()。辅助as函数只是一个语法糖,你也可以说
Derived1& d = *this;
d.foo();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |