继承中的函数定义
Posted
技术标签:
【中文标题】继承中的函数定义【英文标题】:Function definition in Inheritance 【发布时间】:2018-09-01 06:54:11 【问题描述】:在公开继承一个类时,如果基类的公共成员被派生类继承,为什么不能使用派生类的名称定义基类的函数?
例子:
#include <iostream>
using namespace std;
class one
int a;
public:
void get(int);
void show();
;
class two:public one
int b;
public:
void getb(int);
void dis();
;
void one::get(int x) //if i write void two::get(int x) here it gives error
a = x;
void one::show() //same goes for this function why can't i define it as `void two::show()`?
cout << a << endl;
int main()
two ob;
int x;
cin >> x;
ob.get( x );
ob.show();
那么如果one
类的所有公共成员函数都被two
类继承,为什么我不能使用two
类的名称来定义one
类的函数呢?
【问题讨论】:
因为class one
不是抽象类——如果你实例化one
的新实例,它应该使用什么实现?
因为a
是private
类one
的成员,因此无法在类one
之外访问。或者您的问题不清楚...您遇到了什么错误?
你试过override
了吗?
【参考方案1】:
为什么?
在类定义中,您说two
继承自one
。所以它将有以下公共成员:
void get(int); publicly inherited from one
void show(); publicly inherited from one
void getb(int); own member
void dis(); own member
你只能定义two
自己的成员函数,这里是two::getb(int)
和two::dis()
。但是你不能定义two::show()
,因为它是在一个中定义的,而你没有告诉编译器你想要它。
有没有办法拥有不同版本的继承函数?
如果您将类定义如下:
class two:public one
int b;
public:
void getb(int);
void dis();
void show(); //yes you can, but you'll have to define it
;
那么您将拥有以下公共成员:
void get(int); publicly inherited from one
void one::show(); publicly inherited from one but hidden
void show(); own member
void getb(int); own member
void dis(); own member
您可以定义以下内容:
void two::show() //no problem !!
cout << "two's version" << endl;
您甚至可以在main()
中选择您要拨打的电话:
ob.get( x ); // one::get(), because there's no two::get()
ob.show(); // by default two::show(), because ob is a two
ob.one::show(); // yes you can !!
这里是online demo
想要多态性?
在上述所有代码中,调用的函数取决于用于访问对象的类型:
one *pob = &ob; // a one pointer can point to a two object
pob->show(); // but this will invoke one::show()
如果您希望根据对象的实际类型调用正确的函数,而不是根据类型声明假定的类型,则需要使用虚函数并覆盖它们:
class one
... (the rest as before) ...
virtual void show();
;
class two:public one
... (the rest as before) ...
void show() override;
;
然后,每当您调用 show()
时,都会调用正确的函数 (online example),除非您使用完全限定标识符明确指定了一个精确指定的版本。
【讨论】:
以上是关于继承中的函数定义的主要内容,如果未能解决你的问题,请参考以下文章
C++之多态总结(多态的定义及实现,抽象类,多态原理,单继承,多继承中的虚函数表)
scala入门教程:scala中的面向对象定义类,构造函数,继承