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

学前端的想请问两个C++有关问题,求帮助

2013-11-12 
学前端的想请教两个C++问题,求帮助!在父类中定义一个方法method1有两个参数a和b都是String类型,子类继承父

学前端的想请教两个C++问题,求帮助!
在父类中定义一个方法method1有两个参数a和b都是String类型,子类继承父类后,子类又重定义了method1,同时定义了三个参数a,b,c也都是String类型,当实例化子类实例出obj后, 调用obj.method1('aaa','bbb'),会调用父类的method1还是子类的method1? 这个是不是就叫子类的方法重载父类的方法?

那里氏替换原则里的一句话:
“当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。”

这个更宽松是什么意思啊?
[解决办法]
莫名其妙,一个两个参数一个三个参数,无论怎么定义的,只能是两个结果,要么是编译器提示找不到方法,要么就是调用参数个数匹配的那个。

至于是哪一种情况,要看你说的“定义”是怎么定义的。
[解决办法]
调用子类的函数。
[解决办法]
所谓参数宽松,说的是类型,可以是它的基类(扩大了范围,比如说父类要求传一个中国人,那么子类可以要求是传一个人,但是不能是一个北京人),不是参数。

道理也很容易想明白,当你调用一个派生类的时候,有可能不知道派生类定义的类型(否则继承就没有意义了),而只知道基类的类型。所以我们希望只要符合了基类的编程接口的调用,对它的子类也一定是合理的。

比如说我们如果允许一个中国人会写汉字,那么对于一个中国人的派生类(比如北京人),我们毫不怀疑地认为他肯定也会写汉字。
[解决办法]
你不懂等于我白说了。我继续举例:
class 中国人
{
    public:
    virtual void 阅读(中文报纸 newspaper) { ... }
}
class 北京人 : 中国人
{
    public:
    void 阅读(? newspaper) { ... }
}
现在我问你,这个?可以写什么参数?
我们可以写中文报纸,也可以写中英文报纸(假设北京人文化程度比较高,个个会英文,开个玩笑)
能不能写北京日报啊?也就是参数类型更“严格”。
如果那么写,我们就不能保证基于中国人类型,对北京人的“阅读”方法的调用都符合参数要求了。
[解决办法]
struct Base
{
virtual void method1(string a, string b)
{

}
};
struct Derived : public Base
{
virtual void method1(string a, string b, string c)
{
}
};
void main()
{
Derived d;
d.method1("a", "b");
}
   很遗憾,函数重载不能跨越类的作用域,Derived的method1与Base的method1不构成重载,Derived的method1重写了Base的method1,因此编译器将会提示:Derived::method1”: 函数不接受 2 个参数。
[解决办法]

引用:
struct Base
{
virtual void method1(string a, string b)
{

}
};
struct Derived : public Base
{
virtual void method1(string a, string b, string c)
{
}
};
void main()
{
Derived d;
d.method1("a", "b");
}
   很遗憾,函数重载不能跨越类的作用域,Derived的method1与Base的method1不构成重载,Derived的method1重写了Base的method1,因此编译器将会提示:Derived::method1”: 函数不接受 2 个参数。

补充点自己的认识:
1.基类方法的参数和派生类方法的参数个数不一样,那么派生类方法就对基类方法实现了方法“隐藏”(也叫方法“覆盖”),就是说你无法调用基类方法的,所以编译出错。
2.基类方法的参数和派生类方法的参数个数一样,但形参类型不一样,这个应该就是你所说的方法“重载”,那里氏替换原则版主解释得很清楚了。
3.基类方法的参数和类型和派生类中都一样,这个叫方法“重写”(最常用的情况),调用哪个方法由实例类型决定。

热点排行