派生类的拷贝构造函数问题:派生类的引用初始化基类的引用

C++书上说,例如假设C类是B类的派生类,C类的拷贝构造函数形式如下:C::C(C&c1):B(c1){…}B类的拷贝构造函数参数类型应该是B类对象的引用,这是因为类型兼... C++书上说,例如假设C类是B类的派生类,C类的拷贝构造函数形式如下:
C::C(C &c1):B(c1){…}
B类的拷贝构造函数参数类型应该是B类对象的引用,这是因为类型兼容规则在这里起到了作用:可以用派生类的引用去初始化基类的引用。因此当函数的形参是基类的引用时,实参可以是派生类的引用。

但是类型兼容原则不是针对公有继承的派生类的吗?
但是我在VC++6.0里试了一下,改成私有继承也能这么用,那这里用的理由到底是什么呢?
展开
 我来答
帐号已注销
2013-12-03 · TA获得超过3954个赞
知道大有可为答主
回答量:1636
采纳率:77%
帮助的人:1241万
展开全部

那个不叫兼容性,那是把派生类的对象当做基类的对象来使用。


公有继承: 派生类在任何地方都可以作为基类使用。

保护继承: 派生类只可以在派生类成员函数、孙子类成员函数和友元函数内当做基类对象使用。

私有继承: 派生类只能在派生类本身的成员函数以及友元函数内当做基类对象使用。


C::C(C &c1):B(c1){…} 

这段代码定义了派生类的拷贝构造函数, 然后调用了基类的拷贝构造函数(c1被当做基类B的对象来使用)。


#include <iostream>
class Base {
public:
Base() {
std::cout << "Base()" << std::endl;
}
Base(const Base & other) {
std::cout << "Base(const Base &)" << std::endl;
}
};
class Derived : private Base {
public:
Derived() {
std::cout << "Derived()" << std::endl;
}
Derived(const Derived & other) : Base(other) {
std::cout << "Derived(const Derived &)" << std::endl;
}
};
int main() {
Derived d1;
auto d2 = d1;
system("pause");
}
更多追问追答
追问

我用代码试了一下,保护继承,派生类在孙子类成员函数里好像也不能当作基类对象使用的样子诶。

追答
//那是你的代码问题
#include <iostream>
class Base {
};
class Derived : protected Base {
};
void globleUse(Base &) {
}
class GrandSon : public Derived {
private:
void use(Base &) {}
public:
void forUser() {
use(*this);
globleUse(*this);
}
};
int main() {
GrandSon gs;
gs.forUser();
}
旷安南7A
2013-12-03
知道答主
回答量:48
采纳率:0%
帮助的人:27.2万
展开全部
我试了一下在vs2010里面确实不行。子类中的父类成员不可访问,所以不能进行兼容拷贝。不确定是不是这样。不过不同的编译器确实会有不同的结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式