Code Bye

基类析构为private,友元delete,不行吗?

using namespace std;

class base {
    friend class A;
    private:
        virtual ~base() { cout << "~base" << endl; }
};

class inherit : public base {
    private:
        ~inherit() { cout << "~inherit" << endl; }
};

class A { 
    public:
        A(base *b) : p(b) {}
        ~A() { delete p; }
    private:
        base *p; 
};

int main(void)
{
    A a(new inherit);
                 
    return 0;    
} 

编不过,声明为protected没问题,请问这个时候两者的差别是什么呢?

解决方案:20分
你的代码里面,除了 A 的析构会调用 ~base 外, inherit 的析构也需要调用 ~base.
A 有 friend, 调用 ~base 没问题
 inherit 调用 ~base 的时候,如果 ~base 是 protected 的,那么就可以,private 的就不行.   当然,如果在 base 里面再把 inherit 也设置成 friend 的话就可以了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明基类析构为private,友元delete,不行吗?