C++疑难杂症第1弹

C++ Problem - 1st

Posted by BY on July 10, 2020

前言

持续更新了

正文

问题来源

今天工作的时候看到一段关于私有继承的代码。

前言

话不多说上代码

:

#include <iostream>
using namespace std;

class A{
public:
        virtual void a1() = 0;
        virtual void a2() = 0;
};

class B {
public:
        B() {
                a = NULL;
        }
        void setA(A* a) {this->a = a;}
        void print() {
                if (NULL == a) {
                        return;
                }
                a->a1();
                a->a2();
        }
private:
        A* a;
};

class C : private A {
public:
        C() {}
        virtual void a1() {
                cout << "a1" << endl;
        }
private:
        virtual void a2() {
                cout << "a2" << endl;
        }
};

int main() {
        A* p = new C;
        B b;
        b.setA(p);
        b.print();
        return 0;
}

编译出错

inherit.cpp: In function ‘int main()’:
inherit.cpp:40:13: error: ‘A’ is an inaccessible base of ‘C’
  A* p = new C;
// 其余代码不变
class C : private A {
public:
        C() {b.setA(this);} // 给B上设置A的派生类对象
        virtual void a1() {
                cout << "a1" << endl;
        }
        void print() { // 增加给外界调用的入口
                b.print();
        }
private:
        virtual void a2() {
                cout << "a2" << endl;
        }
public:
        B b; // 增加类型为B的成员
};

int main() {
        C c;
        c.print();
        return 0;
}

结果

a1
a2

总结:

私有继承无法转化成派生类指针的处理方法

结语

不管怎么样好好加油。