博主想到写博客来写学习笔记时书已经看到第14章了,那今后的学习笔记都从C++ Primer(中文 第五版)第14章开始记录。
“学生是什么?入学者?参加研究的人?残酷现实社会的避难者?有姓名和一系列考试分数的人?“为何读到这句还是想笑....
回到正题,以下记录为我认为有必要记录或记忆的东西。
私有继承中,在不进行显示类型转换的情况下,不能将派生类的引用或指针賦给基类引用或指针。即私有继承在何处都不能使用隐式向上转换,而保护继承可在派生类内使用隐式向上转换,公有继承则能在类内外都可使用隐式向上转换。这是C++Primer中的写明的,不过博主对这点有疑惑就写了代码进行测试:
#include <iostream>
using std::cout;
using std::endl;
class base_test_class
{
public:
int inta;
base_test_class() { inta = 0; }
};
class test_class:public base_test_class
{
public:
void test_class_func1(base_test_class * p) { };
void test_class_func2(test_class * p);
};
void test_class::test_class_func2(test_class * p)
{
base_test_class * pb = p;
cout << pb->inta << endl;
}
int main()
{
base_test_class * pa = new test_class; // #1
test_class * pb = new test_class;
pb->test_class_func1(pb); // #2
pb->test_class_func2(pb);
return 0;
}
使用公有继承时,以上代码将编译通过,但使用保护继承protected和私有继承private编译时将报错,错误相同:
test601.cpp: 在函数‘int main()’中:
test601.cpp:23:36: 错误: ‘base_test_class’是‘test_class’不可访问的基类
test601.cpp:25:32: 错误: ‘base_test_class’是‘test_class’不可访问的基类
将代码#1、#2两句注释后,编译将通过。即在私有继承派生类内也可以像保护继承一样使用隐式向上转换,这点和C++Primer中说的不同,推测可能是编译器更新后的改动。