如何理解C++ 类的赋值兼容性?

目录

标签(空格分隔): 未分类


window
在学堂在线,看见了清华大学乔林教授讲的一门课《基于Linux的C++》,讲得非常棒,特地记录了部分笔记。

笔记来源课程:

学堂在线 清华大学 20740084X 基于Linux的C++(2016春)

规则

公有派生时,任何基类对象可以出现的位置都可以使用派生类对象代替

  • 将派生类对象赋值给基类对象,仅赋值基类部分
  • 用派生类对象初始化基类对象引用,仅操作基类部分
  • 使指向基类的指针指向派生类对象,仅引领基类部分

保护派生与私有派生不可以直接赋值

  • 尽量不要使用保护派生与私有派生,一般而言,用共有派生就能解决大部分问题

代码示例:

```c++
#include<iostream>
#include<string>
using namespace std;
class Base
{
public:
Base(string s): str_a(s){}
Base(const Base & that){str_a = that.str_a;}
void Print() const{cout<< "In base:" <<str_a <<endl;}
protected:
string str_a;
};
class Derived:public Base
{
public:
Derived(string s1,string s2):Base(s1),str_b(s2){} //调用基类构造函数初始化
void Print() const {cout << "In derived:" << str_a +" "+str_b << endl;}
protected:
string str_b;
};

int main()
{
Derived d1("Hello","World");

<pre><code>Base b1(d1); // 拷贝构造,派生类至基类,仅复制基类部分
d1.Print();
b1.Print();

Base & b2 =d1;//引用,不调用拷贝构造函数,仅访问基类部分
d1.Print();
b2.Print();

Base *b3 = &d1;//指针,不调用拷贝构造函数,仅引领基类部分
d1.Print();
b3->Print();

return 0;
</code></pre>

}

```

结果:

test

参考链接:
C++编程入门系列之四十三(继承与派生:赋值兼容规则)

打赏作者