C++中指向派生类的基类指针、基类引用的一点总结
来源:互联网 发布:网络门店信息平台 编辑:程序博客网 时间:2024/06/05 04:21
#include <iostream>
class A
{
public:
void a1(){
std::cout << "a1" << std::endl;
}
virtual void vt(){
std::cout << "a" << std::endl;
}
private:
void a2(){
std::cout << "a2" << std::endl;
}
protected:
void a3(){
std::cout << "a3" << std::endl;
}
};
class B : public A
{
public:
void b1(){
std::cout << "b1" << std::endl;
}
virtual void vt(){
std::cout << "b" << std::endl;
}
private:
void b2(){
std::cout << "b2" << std::endl;
}
protected:
void b3(){
std::cout << "a3" << std::endl;
}
};
int main()
{
B *pb = new B;
A *pA = pb;
pA->vt(); // 正确:输出为 b (多态性)
pA->a1(); // 正确:输出为 a1
// pA->a2(); // 错误:pA无权访问私有成员函数 a2
// pA->a3(); // 错误:pA无权访问保护成员函数 a3
// pA->b1(); // 错误:b1 不是 类A 的成员函数
// pA->b2(); // 错误:b2 不是 类A 的成员函数
// pA->b3(); // 错误:b3 不是 类A 的成员函数
std::cout << std::endl;
pb->vt(); // 正确:输出为 b (多态性)
pb->a1(); // 正确:输出为 a1
// pb->a2(); // 错误:pb无权访问基类的私有成员函数
// pb->a3(); // 错误:b无权访问基类的保护成员函数
pb->b1(); // 正确:输出为 b1
// pb->b2(); // 错误:pb无权访问自身的私有成员函数
// pb->b3(); // 错误:b无权访问自身的保护成员函数
B b;
A &rb = b;
std::cout << std::endl;
rb.vt(); // 正确:输出为 b (多态性)
rb.a1(); // 正确:输出为 a1
// rb.a2(); // 错误:rb无权访问私有成员函数
// rb.a3(); // 错误:pA无权访问保护成员函数 a3
// rb.b1(); // 错误:b1 不是 类A 的成员函数
// rb.b2(); // 错误:b2 不是 类A 的成员函数
// rb.b3(); // 错误:b3 不是 类A 的成员函数
std::cout << std::endl;
b.vt(); // 正确:输出为 b (多态性)
b.a1(); // 正确:输出为 a1
// b.a2(); // 错误:b无权访问基类的私有成员函数
// b.a3(); // 错误:b无权访问基类的保护成员函数
b.b1(); // 正确:输出为 b1
// b.b2(); // 错误:b无权访问自身的私有成员函数
// b.b3(); // 错误:b无权访问自身的保护成员函数
return 0;
}
结论:
1、对于派生类和基类的访问范围:
(1)派生类可以直接访问自身的公有成员函数和基类中的公有成员函数。
(2)私有成员变量、私有成员函数只能通过调用类中的公有成员函数来访问,不能通过对象名直接访问。派生类不能访问基类的私有成员函数。
(3)保护成员变量、保护成员函数也只能通过调用类中的公有成员函数来访问,不能通过对象名直接访问。派生类可以通过公有成员函数访问基类的保护成员函数。
2、关于指向派生类的基类指针和基类引用的访问范围:
(1)指向派生类的基类指针或者引用,其类型仍然属于基类类型,而不是派生类类型,尽管它指向的是派生类。其访问范围受其基类类型影响,因此只能访问基类中可以访问的类型。
(2)对于虚函数,使用指向派生类的基类指针或基类引用访问时,将会体现出多态性,调用的是实际上是派生类的对应函数。
(3)对于指向派生类的基类引用,虽然说引用通常是被引用对象的一个别名,但这里,基类引用的访问范围与被引用对象的访问范围明显是不一样的!
- C++中指向派生类的基类指针、基类引用的一点总结
- 关于指向派生类的基类指针或引用
- 基类指针和派生类指针的使用总结
- 详解c中指向指针的指针
- C语言中指向指针的指针
- 【C++】派生类对象初始化基类的引用
- c++中指向类数据成员的指针
- c++中指向类数据成员的指针
- C语言中指向函数的指针
- C语言中指向函数的指针
- C语言中指向函数的指针
- 为何mfc不使用 dynamic_cast这样的基指针向派生类指针的显示转换?(转)
- 为什么基类指针(或引用)可以调用派生类的private虚函数
- c中指向指针的指针怎么理解?
- C/C++中指向指针的指针传递函数
- 关于C++基类、派生类的引用和指针
- 基类指针和派生类指针的使用总结(二)
- 基类指针与派生类指针的相互转换
- Java面向对象基础--类的设计及分析问题的方法---用户登录例子
- 在Eclipse中查看JDK类库的源代码
- Android 匿名共享内存C接口分析
- C# delegate
- 网站设计中的造境技巧
- C++中指向派生类的基类指针、基类引用的一点总结
- Ubuntu 12.4 下升级 Subversion 1.7的方法
- 计算机行业感悟~
- BackgroundWorker例子
- c++设计模式--命令模式
- discuz后台主导航栏菜单中添加新的菜单项的方法
- 数组初始化
- 转载TortoiseSVN的使用详解 二
- TortoiseSVN的使用详解 三