解决友元不可继承的技巧
来源:互联网 发布:多用户建站系统源码 编辑:程序博客网 时间:2024/05/01 14:33
#include <iostream>
class B
{
friend class A;
private:
virtual void Print() const {
std::cout << "B" << std::endl;
}
};
class D: public B
{
private:
virtual void Print() const {
std::cout << "D" << std::endl;
}
};
class A
{
public:
A() {
B b;
std::cout << "A Constructor: ";
b.Print(); // ok
//D d;
//d.Print(); // error: 'virtual void D::Print() const' is private
}
void Print(const B &b) const {
std::cout << "A --> ";
b.Print();
}
};
int main()
{
A a;
B b;
D d;
a.Print(b);
a.Print(d);
}
在上面的代码中,被注释了的部分不能够通过编译,因为D不是A的友元类,B的友元关系并没有被继承。而在A的Print函数成员中,参数为基类B的const引用;而实参却可以是D类的对象,从而实现了在A类中调用D类成员的目的。当然,你完全可以把A声明为D的友元类。但是,这时主要想说明一个问题,那就是,有了虚机制,可以“继承”这种友元关系。
对这种机制的解释:首先,在A的Print函数中,通过B类对象调用其私有的虚函数(b.Print();),由于A是B的友元,该调用是完全合法的。而在用D对象调用A的Print函数时时,b.Print()调用动态绑定到了对D类对象的函数版本的调用。
这里,也说明了另外一个问题:类成员的访问控制只是在编译时有效。
- 解决友元不可继承的技巧
- 解决友元不可继承的技巧
- 友元关系的继承
- 友元函数的继承
- C++编程技巧,利用继承实现对他类的友元
- [C++]友元关系的继承性
- 友元和继承
- 友元与继承
- 类、友元、继承
- 继承、友元机制。
- C++笔记: 继承,友元
- 继承 之 友元函数
- 友元关系与继承
- 友元关系和继承
- C++ 友元与继承
- C++ 友元和继承
- C++ 继承、友元、权限
- 友元类与友元函数的继承与传递问题
- 不定期推荐一些好看的小说
- 很久没更新了
- 朴实为美
- 羽毛球杀球小技巧
- 分割字符串 (二)
- 解决友元不可继承的技巧
- C++对象对内存的使用
- ipod shuffle 2充电器
- 这次龙虾吃爽了.
- 使用access时遇到的一个问题
- 从普京拜访索尔仁尼琴说起
- 嵌入式开发经典网站集锦
- 一个程序员的面试经历,大家来评评
- 孙鑫vc++ 第十二课 笔记 C语言对文件读写的支持