首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多态,该怎么解决

2012-04-26 
多态1。多态中的virtual函数中在子类可不可以有不同的参数列表,比如说基类不带参数,子类重新实现的时候加了

多态
1。多态中的virtual函数中在子类可不可以有不同的参数列表,比如说基类不带参数,子类重新实现的时候加了参数

2.子类函数B调用基类函数A,基类函数A返回数据成员,那这个数据成员的值是基类的还是子类的

3.在类之外,假设基类名字为A 基类中一个函数名为B 为什么不能用A::B方式调用//这个可能和多态无关

4.基类的一个virtual函数为A,基类提供实现 ,子类重新实现这个函数,这两个函数都是操作数据成员B 并将结果返回
问题是 想要返回基类实现的结果 但是用的子类数据成员B的值 比如说基类中B的值为10 ,子类中B的值为20,基类A函数
返回值B+1, 而子类A函数返回B+5, 那如何用基类的函数 但是B的值为20 就是返回21 而不是25

谢谢了 觉得问题哪里不清楚的 麻烦说下

[解决办法]
1. 不可以。因为那样函数的签名就不同了,将会是一个完全不同的函数。virutal函数的目的就是为了定义一个接口函数,因此函数的声明必须和基类一致。
2. 严格地说:是基类的,也是子类的。基类所有的成员变量都会被派生类继承下来,即使是基类中的private成员变量,只不过在这种情况下,派生类不能访问那个成员变量吧了。
3. 通常情况下,只有静态成员函数才能通过A::B这样的方式调用,非静态函数都是和类的实例(即对象)相关的,因此调用的时候,必须现有对象,然后才能调用。比如,如果B是一个非静态成员函数,那么只能:
A a;
a.B();
或者:
A* pa = new A;
pa->B();
这样的方式调用。

如果B是一个静态成员函数,由于静态成员函数是类级别的,即一个类所有的实例都共享这个成员函数,因此可以不用定义该类的实例(对象),就可以直接通过A::B()这样的方式调用。

4. 是不可以做到的。因为不可能做到使用动态类型的成员函数,同时又使用静态类型的成员变量。这两者必须保持一致,及要么成员函数和成员变量都是动态类型,要么都是静态类型的。

[解决办法]

探讨
引用:

子类自基类继承的不是具体的数据,而是一个框架,具体的数据要在实例化时才被保存。既然它们都定义了数据成员C,那么被存储在子类实例对象里的就只有子类的数据成员C,而没有基类的数据成员C了。

也就是说 子类只是利用基类函数的实现 但是数据成员是自身的数据成员?

[解决办法]
子类和基类的关系一般有两种:
1.is-a关系,即 子类是基类类型的一种,子类是个更具体,更特殊的类型.
2.has-a关系,即子类是 基类的某一个组成部分.

根据这两种关系去澄清 子类和基类各自的 职责
[解决办法]
1. 不可以,参数必须相同, 否则是隐藏, 返回值类型可以不一样,比如:斜边。

2. 子类的。


3.4 没有看懂。

热点排行