派生类的拷贝构造函数问题:派生类的引用初始化基类的引用
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里试了一下,改成私有继承也能这么用,那这里用的理由到底是什么呢? 展开
C::C(C &c1):B(c1){…}
B类的拷贝构造函数参数类型应该是B类对象的引用,这是因为类型兼容规则在这里起到了作用:可以用派生类的引用去初始化基类的引用。因此当函数的形参是基类的引用时,实参可以是派生类的引用。
但是类型兼容原则不是针对公有继承的派生类的吗?
但是我在VC++6.0里试了一下,改成私有继承也能这么用,那这里用的理由到底是什么呢? 展开
展开全部
那个不叫兼容性,那是把派生类的对象当做基类的对象来使用。
公有继承: 派生类在任何地方都可以作为基类使用。
保护继承: 派生类只可以在派生类成员函数、孙子类成员函数和友元函数内当做基类对象使用。
私有继承: 派生类只能在派生类本身的成员函数以及友元函数内当做基类对象使用。
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();
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询