C++-多继承类型转换问题?

C++-多继承类型转换问题?

甜柠檬 发布于 2017-03-01 字数 488 浏览 1108 回复 5

看下面的继承体系:

 class Based_A
{
public:
virtual void print_A() = 0;
};

class Based_B
{
public:
virtual void print_B() = 0;
};

class Derived : public Based_A, public Based_B
{
public:

void print_A()
{
cout << "print_A in Derived" << endl;
}

void print_B()
{
cout << "print_B in Derived" << endl;
}
};

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

晚风撩人 2017-10-18 5 楼

不用转换,基类中含有虚函数,这个继承体系属于虚继承,直接定义一个Based_B的指针,把based_a赋值给它就好了,虚拟继承的多态机制会通过决议调用Based_B中的print_B()。

浮生未歇 2017-09-22 4 楼

你把这个Based_A* based_a 指针转换成Derived* 对象指针,然后再调用print_B()即可,完全不用转化成基类Based_B* 对象指针。

想挽留 2017-03-26 3 楼

多继承的时候从一个基类转换到另一个基类的确是一个问题,C++对此的解决方案就是dynamic_cast,但需要编译器支持。对VC++来说,需要打开生成运行时类型信息的选项(新版本里面默认是打开的)
然后就可以用

  Based_B* based_b = dynamic_cast<Based_B*>(based_a);
based_b->print_B();

在运行的时候,代码会检查based_a指向的类的实际类型信息,然后根据实际类型信息进行转换。

这种情况下是不能使用静态转换的,因为如果有另一个类

 class Derived2 : public Based_A, public Based_C, public Based_B
{
...
};

对这个类的Based_B指针转换到Based_A,指针的偏移量是不同的,所以同样是Based_B* based_b = dynamic_cast<Based_B*>(based_a),执行的效果会不一样,所以不能用静态转换。

甜柠檬 2017-03-12 2 楼

我觉得这个问题并不需要用 dynamic_cast 转换操作符。
对于类 Derived 它有两个父类 Based_A 和 Based_B,并且实现了它们的抽象函数,其实 Based_A* based_a 也只是保存了Derived 对象的起始地址,可以直接赋值给 Based_B* based_b:

 Based_B* based_b = (Based_B*)(based_a);
based_b->print_B();

这样也是完全没问题的,这样就可以使用 Based_B 中的函数了。

浮生未歇 2017-03-03 1 楼

简单的说这个问题,两个类都是其父类。用父类指针指向派生类这个本来就合法。所以这个转换没有问题。可以使用基类B中的函数