读书人

私有沿袭是否调用父类构造函数

发布时间: 2013-07-08 14:13:00 作者: rapoo

私有继承是否调用父类构造函数
#include <iostream>
using namespace std;

class A {
public:
A(){}
~A(){}
A(const A& that){}

};
class B : private A {
public:
B(){}
~B(){}
//这????
B(B& that):A(that){}
};
//以上代码编译通过。加上后面的代码编译出错
//(privateclass.cpp:21:8: 错误: 请求从‘A’转换到非标量类型‘B’)
int main ()
{
A a;
B b = a;
return 0;
}

继承 类
[解决办法]
你的错误在B b = a;
private继承,在派生类内是可以随便调用基类的public函数的,包括构造函数,但在类外就不能调用任何基类函数,只能调用派生类的public函数
private继承还会导致派生类与基类无法互相转化,但你的情况不是这样,你试图用基类对象初始化派生类对象,就算不是private继承,这本来就是通不过的吧,基类无法转化为派生类
[解决办法]
B(B& that):A(that){}
A没有参数为B&的构造函数
[解决办法]
和继承没有关系,
B b = a;
是用 A 来构造 B
但是你的 B 没有接受 A 参数的构造函数.
改成 B(A& that):A(that){} 这样就是 OK 的.
[解决办法]
private继承会调用构造,它的作用是用来组合的。B b = a;你这个是想用多态还是咋回事?

[解决办法]

引用:
B(B& that):A(that){} 对这句编译能通过 B类引用传入的参数是A类对象 而后面的却不可以 这里疑问。

这句是把B类当成A类,而你是想把A类当成B类
[解决办法]
引用:
你的错误在B b = a;
private继承,在派生类内是可以随便调用基类的public函数的,包括构造函数,但在类外就不能调用任何基类函数,只能调用派生类的public函数
private继承还会导致派生类与基类无法互相转化,但你的情况不是这样,你试图用基类对象初始化派生类对象,就算不是private继承,这本来就是通不过的吧,基类无法转化为派生类

私有继承一般在什么情况下使用?
[解决办法]
引用:
Quote: 引用:

你的错误在B b = a;
private继承,在派生类内是可以随便调用基类的public函数的,包括构造函数,但在类外就不能调用任何基类函数,只能调用派生类的public函数
private继承还会导致派生类与基类无法互相转化,但你的情况不是这样,你试图用基类对象初始化派生类对象,就算不是private继承,这本来就是通不过的吧,基类无法转化为派生类
私有继承一般在什么情况下使用?
私有继承主要目的是为了利用基类的实现,一般不需要用到,用私有继承的场合基本都可以换成包含的方式
但有些特殊的场合需要用到私有继承才能实现,比如公开基类的个别接口(using base::f1();),用到基类的保护成员等
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

你的错误在B b = a;
private继承,在派生类内是可以随便调用基类的public函数的,包括构造函数,但在类外就不能调用任何基类函数,只能调用派生类的public函数
private继承还会导致派生类与基类无法互相转化,但你的情况不是这样,你试图用基类对象初始化派生类对象,就算不是private继承,这本来就是通不过的吧,基类无法转化为派生类
私有继承一般在什么情况下使用?
私有继承主要目的是为了利用基类的实现,一般不需要用到,用私有继承的场合基本都可以换成包含的方式
但有些特殊的场合需要用到私有继承才能实现,比如公开基类的个别接口(using base::f1();),用到基类的保护成员等
多了个括号using base::f1;
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

B(B& that):A(that){} 对这句编译能通过 B类引用传入的参数是A类对象 而后面的却不可以 这里疑问。

这句是把B类当成A类,而你是想把A类当成B类

这句没有调用 A(const A& that){}
行了,你自己再好好看看2,3楼和5楼你自己说的话吧,好好理解下

读书人网 >C++

热点推荐