美文网首页
★05.关于多重继承

★05.关于多重继承

作者: iDragonfly | 来源:发表于2017-06-30 21:23 被阅读0次

    类型转换二义性

    class A { };
    class B { };
    class C : public A, public B { };
    
    void print(A & a) {}
    void print(B & a) {}
    
    int main() {
        C c;
        print(c);       // 二义性
        return system("pause");
    }
    

    基类的构造顺序与派生列表中基类的顺序一致

    代码

    class A {
    public:
        A() { std::cout << "A()" << std::endl; }
    };
    
    class B {
    public:
        B() { std::cout << "B()" << std::endl; }
    };
    
    class C : public A, public B {
    public:
        C() = default;
    };
    
    class D : public B, public A {
    public:
        D() = default;
    };
    
    int main() {
        C c;
        std::cout << "--------------" << std::endl;
        D d;
        return system("pause");
    }
    

    输出结果

    A()
    B()
    --------------
    B()
    A()
    

    继承基类构造函数

    class A {
    public:
        A() { std::cout << "A()" << std::endl; }
        A(int a) { std::cout << "A(int a)" << std::endl; }
        A(char a) { std::cout << "A(char a)" << std::endl; }
    };
    
    class B {
    public:
        B() { std::cout << "B()" << std::endl; }
        B(double a) { std::cout << "B(double a)" << std::endl; }
        B(char a) { std::cout << "B(char a)" << std::endl; }
    };
    
    
    class C : public A, public B {
    public:
        using A::A;
        using B::B;
    
        C() { std::cout << "C()" << std::endl; }
        C(char a) { std::cout << "C(char a)" << std::endl; }
    };
    
    // 多重继承中继承构造函数时,派生类的其他成员执行默认初始化
    int main() {
        std::cout << "--------------" << std::endl;
        C a(0);
        std::cout << "--------------" << std::endl;
        C b(0.0);
        std::cout << "--------------" << std::endl;
        C c('0');
        std::cout << "--------------" << std::endl;
        return system("pause");
    }
    

    名字查找二义性问题

    注意:编译器并不检查可取用性,即便实际上只有一个可取用

    class A {
    public:
        void doSomething1() {}
        void doSomething2() {}
        void doSomething3() {}
        int a;
    };
    
    class B {
    public:
        void doSomething1() {}
        void doSomething2(int) {}
    
    private:
        void doSomething3() {}
        int a;
    };
    
    class C : public A, public B {
    };
    
    int main() {
        C c;
        c.doSomething1();      // 错误
        c.doSomething2();      // 错误
        c.doSomething3();      // 错误
        c.a;
        return system("pause");
    }
    

    相关文章

      网友评论

          本文标题:★05.关于多重继承

          本文链接:https://www.haomeiwen.com/subject/dlwicxtx.html