+ -
当前位置:首页 → 问答吧 → 关于c++继承中的函数覆盖问题

关于c++继承中的函数覆盖问题

时间:2011-12-15

来源:互联网

class A
{
  private:
  int a;
  public:
  void fun1() {..}
  void fun2() {..}
 };
class B :protected A
{
  protected:
  int b;
  public:
  void fun1() {..}
  void fun2() {..}
};

问题: class B 的保护成员有几个(包括数据成员和函数成员)?


我认为只有一个int b,因为class A中的fun1() 和fun2() 被覆盖了不是吗?

作者: neolyao   发布时间: 2011-12-15

父类的保存成员也是的

作者: duke56   发布时间: 2011-12-15

我认为只有一个int b,因为class A中的fun1() 和fun2() 被覆盖了不是吗?

被覆盖了不是被删除了。
覆盖只是在某个视野看不到而已。
实际上他还是存在的。

只要你这样访问:

A::fun1();//存在。

作者: mingliang1212   发布时间: 2011-12-15

引用 2 楼 mingliang1212 的回复:
我认为只有一个int b,因为class A中的fun1() 和fun2() 被覆盖了不是吗?

被覆盖了不是被删除了。
覆盖只是在某个视野看不到而已。
实际上他还是存在的。

只要你这样访问:

A::fun1();//存在。


如果这样访问A::fun1();不恰恰说明fun1()是属于A的而不是属于B的了吗??

作者: neolyao   发布时间: 2011-12-15

实际上应该写成这样:

this->A::fun1();//this指针是属于B的。

在B的某个函数中,如果有:
A a;
a.A::fun1()//错误。无法访问A类的成员fun1();只能访问属于自己的fun1()也就是派生过来的那一部分是B所有的。
a.fun1()//同上。

作者: mingliang1212   发布时间: 2011-12-15

引用 3 楼 neolyao 的回复:

引用 2 楼 mingliang1212 的回复:
我认为只有一个int b,因为class A中的fun1() 和fun2() 被覆盖了不是吗?

被覆盖了不是被删除了。
覆盖只是在某个视野看不到而已。
实际上他还是存在的。

只要你这样访问:

A::fun1();//存在。


如果这样访问A::fun1();不恰恰说明fun1()是属于A的而不是属于B的了吗??
……


子类是父类的超集,C++成员函数不属于任何类,它们就是一段代码。
使用跳转指令就可以到达函数地址并执行,记得给它们传入正确的this指针就可以了。
C++中只要不是私有继承,子类就可以使用 父类::函数名(); 的形式调用父类的任何非
因为 父类::函数名(); 已经提供给了编译器足够的信息,可以转向正确的函数地址。

作者: mymixing   发布时间: 2011-12-15

引用 5 楼 mymixing 的回复:

子类是父类的超集,C++成员函数不属于任何类,它们就是一段代码。
使用跳转指令就可以到达函数地址并执行,记得给它们传入正确的this指针就可以了。
C++中只要不是私有继承,子类就可以使用 父类::函数名(); 的形式调用父类的任何非
因为 父类::函数名(); 已经提供给了编译器足够的信息,可以转向正确的函数地址。
引用 2 楼 mingliang1212 的回复:

C++中只要不是私有继承,子类就可以使用 父类::函数名();
为什么私有继承不行呢!!!

作者: neolyao   发布时间: 2011-12-15

引用 6 楼 neolyao 的回复:
为什么私有继承不行呢!!!

没看过C++的任何版本历年标准,但只要知道
编译器没给你实现就OK了,如果编译器支持,那么就可以这么做
你写的任何C\C++语句,电脑本身都是看不懂的,电脑并不知道C\C++是个什么东西
你写的C\C++语句都是由编译器来翻译成2进制码,再link成可执行文件的。
所以你只能写一些编译器支持你做的事情,一旦违规,它会回绝你的编译请求。
就是编译报错。

作者: mymixing   发布时间: 2011-12-15