首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多重继承顺序重要吗?

多重继承顺序重要吗?
EN

Stack Overflow用户
提问于 2021-03-26 09:44:34
回答 2查看 69关注 0票数 1

我想出了一些令人困惑的情况。下面是它们。

代码语言:javascript
运行
复制
#include <iostream>

using namespace std;

class Base {
public:
    Base(int num) : data(num) {
        cout << "BASE : " << num << endl;
    }
    virtual ~Base() = default;

    virtual void func1() {
        cout << "Base func1 called : " << data << endl;
    }

    virtual void func3() {
        cout << "Base func3 called : " << data << endl;
    }

private:
    int data;
};

class Interface {
public:
    Interface() {
        cout << "INTERFACE : " << endl;
    }
    virtual ~Interface() = default;

    virtual void func2() {
        cout << "Interface func2 called" << endl;
    }
};

class Derived : public Interface, public Base {
public:
    Derived() : Base(0) {
        cout << "DERIVED : hh" << endl;
    }
    virtual ~Derived() = default;

    virtual void func1() override {
        cout << "Derived fuc1 called" << endl;
    }

    virtual void func3() override {
        cout << "Derived fuc3 called" << endl;
    }

    virtual void func2() override {
        cout << "Derived fuc2 called" << endl;
    }


};

int main() {
    //Interface* a = new Derived(); // derived func2 called
    //Base* a = new Derived();    // derived func1 called
    //Derived* a = new Derived(); // derived func2 called
    void* a = new Derived();      // derived func1 called
    auto b = (Interface*)a;
    b->func2();
    
    ...
}

执行b->func2()时,结果因变量a的显式类型而异。

结果在评论中。

为什么在执行b->func2()时它们是不同的

EN

Stack Overflow用户

发布于 2021-03-26 10:04:33

行为是未定义的,因为您不会将void *转换回实际类型。

你要么需要做

代码语言:javascript
运行
复制
 void *a = (Interface*)(new Derived());
 auto b = (Interface *)a;

或者在你的两个人之间添加额外的步骤

代码语言:javascript
运行
复制
void* a = new Derived();     
auto temp = (Derived *)a;     // explicitly convert the void pointer to the actual type
auto b = (Interface*)temp;

这相当于

代码语言:javascript
运行
复制
void* a = new Derived();     
auto b = (Interface*)((Derived *)a);

无论哪种方式,如果在转换为Interface *之前没有将void *转换为Derived *,则行为是未定义的。

考虑使用其中一个_cast(例如static_cast)进行转换,而不是C风格的强制转换。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66809927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档