NOTE: 1.derived classes 内的名称会遮掩base classes内的名称.在public继承下从来没有人希望如此. 2.为了让被遮掩的名称再见天日,可使用using 声明方式或转交函数(forwarding functions).…
首先介绍一个原则LSP(Liskov Substitution Principle),如果Class D以Public方式继承Class B,则所有B对象可以派上用场的任何地方,D对象一样可以派上用场. 对于重载和重写,相信大家都已经有所了解.这里讨论一下在public继承的时候,重载函数的问题. 先看下面的例子: class Base { public: ; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(doub…
derived classes内的名称会遮掩base classes内的名称.在public继承下从来没有人希望如此. 为了让被遮掩的名称再见天日,可使用using声明式或转交函数(forwarding functions).…
(一) 以下这段代码: int x; void someFunc() { double x; //local variable std::cin>>x; //read a new value to local x } 这个指涉的是local变量x.而不是global变量x.由于内存作用域会的名称遮掩外围作用域的名称. 当编译器处于someFunc的作用域内并遭遇名称x时,他在local作用域内查找是否有什么东西带着这个名称.假设找到就不再找其它作用域.someFunc的x是double类型而g…
名称的遮掩可以分成变量的遮掩与函数的遮掩两类,本质都是名字的查找方式导致的,当编译器要去查找一个名字时,它一旦找到一个相符的名字,就不会再往下去找了,因此遮掩本质上是优先查找哪个名字的问题. 而查找是分作用域的,虽然本条款的命名是打着“继承”的旗子来说的,但我觉得其实与继承并不是很有关系,关键是作用域. 举例子说明这个问题会比较好理解. //例1:普通变量遮掩 ; int main() { ; cout << i << endl; // 输出4 } 这是一个局部变量遮掩全局变量的例…
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie ? 不懂 c++为什么derived classes 内的名称要遮掩 base classes 内的名称. 经验:derived classes 内的名称会遮掩 base classes 内的名称. 在 public 继承下从来没有人希望如此. C++ 的名称遮掩规则所做的唯一事情就是: 遮掩名称 derived class 作用域被嵌套在 base class 作用域里 class Ba…
这一章一直在想怎么写,因为比较基础,很容易理解,就按照需要来写吧. 假设我们有这样一个类: class Base { private: int x; public: ; virtual void mf2(); void mf3(); }; class Derived : public Base { public: virtual void mf1(); void mf4(); }; 如果mf4()的实现代码为: void Derived::mf4(){ mf2(); } 在查找mf2()函数的过…
先看看: ZT C++ 重载.覆盖和隐藏的区别 http://www.cnblogs.com/jeanschen/p/3405987.html 隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: 1) 如果派生类的函数与基类的函数同名,但是参数不同.此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆). 2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字.此时,基类的函数被隐藏(注意别与覆盖混淆). #include <ios…
class Base { private: int x; public: ; virtual void mf2(); void mf3(); ... }; class Derived: public Base { public: virtual void mf1(); void mf4(); ... }; 上面代码构成了一个 namespace 在 derived class 内的 mf4 代码实现为 void Derived::mf4() { ... mf2(); ... } 编译器看到 mf…
Avoid hiding inherited names 作用域(scopes)所带来的名称二义性,c++编译器会寻找指涉(refer to)的对象并实现名称遮掩规则(name-hiding rules). 寻找指涉对象的顺序,由内到外依次寻找. 继承会导致遮掩(破坏is-a) 但如下代码: class Base { public: virtual void mf1() = 0; virtual void mf1(int); void mf3(); void mf3(double); }; cl…