詳解C++類型兼容性規(guī)則
一個(gè)公有派生類的對(duì)象在使用上可以被當(dāng)作基類的對(duì)象,反之則禁止。具體表現(xiàn)在:
- 派生類的對(duì)象可以被賦值給基類對(duì)象。
- 派生類的對(duì)象可以初始化基類的引用。
- 指向基類的指針也可以指向派生類。
通過基類對(duì)象名、指針只能使用從基類繼承的成員
舉例:
1.派生類的對(duì)象可以被賦值給基類對(duì)象。這是一個(gè)總綱領(lǐng),意味著在需要基類對(duì)象的地方,我們都可以用一個(gè)派生類對(duì)象來替代。
這會(huì)導(dǎo)致對(duì)象切片
#include <iostream>
#include <string>
// 基類
class Person {
public:
std::string name;
void introduce() {
std::cout << "我是一個(gè)人, 我的名字是 " << name << std::endl;
}
};
// 公有派生類
class Student : public Person {
public:
int studentID; // 派生類特有的成員
void study() { // 派生類特有的方法
std::cout << name << " 正在學(xué)習(xí), 學(xué)號(hào)是 " << studentID << std::endl;
}
};
int main() {
Student stu;
stu.name = "張三";
stu.studentID = 101;
Person per;
per = stu; // 將派生類對(duì)象 stu 賦值給 基類對(duì)象 per
std::cout << "基類對(duì)象 per 的名字: " << per.name << std::endl;
per.introduce();
// per.studentID = 102; // 錯(cuò)誤! per 是一個(gè) Person 對(duì)象, 它沒有 studentID 成員。
// per.study(); // 錯(cuò)誤! per 是一個(gè) Person 對(duì)象, 它沒有 study() 方法。
}解釋:
當(dāng)執(zhí)行 per = stu; 時(shí),stu 對(duì)象中從 Person 繼承來的部分(也就是 name 成員)被拷貝到了 per 對(duì)象中。stu 對(duì)象自己獨(dú)有的成員(studentID)被完全“切掉”和丟棄了。因此,per 仍然是一個(gè)純粹的 Person 對(duì)象,它只知道 name,不知道任何關(guān)于 studentID 或 study() 的信息。
2.派生類的對(duì)象可以初始化基類的引用。這是實(shí)現(xiàn)多態(tài)的一種非常安全和常見的方式,不會(huì)發(fā)生對(duì)象切片。
#include <iostream>
#include <string>
// 基類
class Person {
public:
std::string name;
void introduce() {
std::cout << "我是一個(gè)人, 我的名字是 " << name << std::endl;
}
};
// 公有派生類
class Student : public Person {
public:
int studentID; // 派生類特有的成員
void study() { // 派生類特有的方法
std::cout << name << " 正在學(xué)習(xí), 學(xué)號(hào)是 " << studentID << std::endl;
}
};
int main() {
Student stu;
stu.name = "李四";
stu.studentID = 102;
// 使用派生類對(duì)象 stu 來初始化一個(gè)基類的引用
Person& per_ref = stu;
std::cout << "通過基類引用訪問名字: " << per_ref.name << std::endl;
per_ref.introduce(); // 調(diào)用的是 Person 的方法
// per_ref.study(); // 錯(cuò)誤! 雖然引用指向的是 Student 對(duì)象,但引用本身是 Person 類型,
// 只能訪問 Person 中定義的成員。
}解釋:
per_ref 是基類 Person 的一個(gè)引用,它直接綁定到了 stu 這個(gè)派生類對(duì)象上。內(nèi)存中只有一個(gè) stu 對(duì)象,沒有發(fā)生任何拷貝。per_ref 成為了 stu 對(duì)象的一個(gè)“別名”,但這個(gè)別名是 Person 類型的,所以它有一個(gè)受限的“視野”。
3.指向基類的指針也可以指向派生類。這是實(shí)現(xiàn)多態(tài)最核心、最靈活的方式,同樣不會(huì)發(fā)生對(duì)象切片。
#include <iostream>
#include <string>
// 基類
class Person {
public:
std::string name;
void introduce() {
std::cout << "我是一個(gè)人, 我的名字是 " << name << std::endl;
}
};
// 公有派生類
class Student : public Person {
public:
int studentID; // 派生類特有的成員
void study() { // 派生類特有的方法
std::cout << name << " 正在學(xué)習(xí), 學(xué)號(hào)是 " << studentID << std::endl;
}
};
int main() {
Student stu;
stu.name = "王五";
stu.studentID = 103;
// 基類指針指向派生類對(duì)象
Person* per_ptr = &stu;
std::cout << "通過基類指針訪問名字: " << per_ptr->name << std::endl;
per_ptr->introduce(); // 調(diào)用的是 Person 的方法
// per_ptr->study(); // 錯(cuò)誤! 指針類型是 Person*,它“看”不到 Student 類中新增的成員。
}解釋:
`per_ptr` 是一個(gè) `Person` 類型的指針,它存儲(chǔ)了 `stu` 對(duì)象的內(nèi)存地址。和引用一樣,它也只是提供了一個(gè)基類“視角”來觀察這個(gè)派生類對(duì)象。
到此這篇關(guān)于詳解C++類型兼容性規(guī)則的文章就介紹到這了,更多相關(guān)C++類型兼容性規(guī)則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt實(shí)現(xiàn)字幕無間隙滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)字幕無間隙滾動(dòng)效果,文中的實(shí)現(xiàn)過程講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11
C語言多種方法實(shí)現(xiàn)一個(gè)函數(shù)左旋字符串中K個(gè)字符
這篇文章主要為大家介紹了C語言多種方法實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中K個(gè)字符,文中附含詳細(xì)的示例講解,有需要的朋友可以借鑒參考下2021-10-10
C語言結(jié)構(gòu)體計(jì)算內(nèi)存占用問題解析
這篇文章主要介紹了C語言結(jié)構(gòu)體計(jì)算內(nèi)存占用問題解析,本文通過案例來解析了C語言計(jì)算結(jié)構(gòu)體內(nèi)存的方式和方法,需要的朋友可以參考下2021-07-07
Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程
這篇文章主要介紹了Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程 ,需要的朋友可以參考下2020-02-02
vc控制臺(tái)程序關(guān)閉事件時(shí)的處理方式及注意點(diǎn)詳解
在本篇文章里小編給大家整理的是一篇關(guān)于vc控制臺(tái)程序關(guān)閉事件時(shí)的正確處理方式的相關(guān)知識(shí)點(diǎn)內(nèi)容,對(duì)此有需求的朋友們可以參閱下。2021-12-12

