c++中只有使用指针才能多态吗?普通实例和引用为什么不能多态?

父类:Father 子类:Child{m_childAttr}
func(/*const*/ Father ¶)//这里和const无关,但是我还是习惯在以类为参数时加上const和引用
{
Child c;

c.m_childAttr = ((Child)para).m_childAttr;//编译不通过,报错的意思大概是“没有定义Father到Child的强转”
c.m_childAttr = ((Child*)(&m_para))->m_childAttr;//编译通过。先取地址变成指针,再强转为指向Child的指针,从而访问Father没有的属性

}
func(/*const*/ Father ¶)应为func(/*const*/ Father para)

多态是和继承联系在一起的,指针是指向一段内存地址,所以可以实现父类的指针指向子类的对象。因为指向的地址都是一个,只不过所容纳的内容有大有小。从子类的内容(大的)取出父类的内容(小的)是可以的,也就是父类的指针指向子类的对象是可行的,反之则不行,因为父类的小,反过来就会有一段内存是空的或者其它不定的内容。追问

关于“指针能多态,而普通变量不能”说得很清楚,我明白了。
引用的本质跟指针一样,能不能多态呢?为什么我那段代码用引用来多态就报错?

追答

引用和指针看上去很多效果是一样的,其实是不同的。引用是别名,也就是一个东西叫几个不同的名字。所以一个对象不可能即是爸爸又是儿子,所以是不能多态的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-03-13
C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。
虚函数是指在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
C++为了让一个类成为抽象类,至少必须有一个纯虚函数。包含至少一个纯虚函数的类视为抽象类。
第2个回答  推荐于2016-02-11

C++不是只有指针才能多态。

 

多态主要有两种方法实现:

    基类的指针加上虚函数;

    基类的引用加上虚函数。

也就是说可以用引用实现多态,但是都必须使用虚函数。

第3个回答  2014-07-27
C++用函数指针实现多态,动态编译寻找你要调用的方法,其他语言如java、C#底层多态实现机制其实都是函数指针,只是功能封装丰富了
第4个回答  2014-07-27
引用和指针都可以

C++引用的引用和多态
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。【例】:class A;class B:public A{……};B b;A &Ref = b; \/\/ 用派生类对象初始化基类对象的引用Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚...

C++: 虚函数的多态性 只给指向派生类的基类指针使用,而如果基类对象直接...
C++默认通过对象名访问的方式是按值访问,不是按指针和引用。 按值会导致派生类对象在向基类转换时发生截断(即去掉派生类的部分,只保留基类部分)。按指针和引用访问方式不会导致截断问题,所以可以实现多态。大家都知道在C++里这个表达式:obj1 = obj2; (obj1 和 obj2 是某个类的对象的名字。)是...

c++中什么是多态!
在C++中接口的多种不同的实现方式就是多态。多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。允许将子类类型的指针赋值给父类类型的指针。多态性在ObjectPascal和C++中都是通过虚函数实现的。赋值之后,父类型...

c++中函数指针只能指向静态方法吗?为什么。
多态就是不同对象接受相同的消息,但是却产生不同的行为,举一个很简单的例子,有一个图形类,他有几个派生类,如圆形,三角形,矩形。图形类有一个函数area();用来求面积,但是由于不同图形求面积的方法不同,要由具体的派生类来决定,所以可以把它定义为一个虚函数,由派生类来重载这个函数,所...

C++中多态是怎样实现的?
多态是一种不同的对象以单独的方式作用于相同消息的能力,这个概念是从自然语言中引进的。例如,动词“关闭”应用到不同的事务上其意思是不同的。关门,关闭银行账号或关闭一个程序的窗口都是不同的行为;其实际的意义取决于该动作所作用的对象。大多数面向对象语言的多态特性都仅以虚拟函数的形式来实现...

什么叫做多态性,在c++中是如何实现多态的
静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:1)函数模板 template <typename T> T max(const T& lsh, const T& rhs){ return (lsh > rhs) ? lsh : rhs;} 返回两个任意类型对象的最大值(对象),前提是该类型能够使用>运算符进行...

什么是非多态的类对象?是不是说直接构建的对象,既非引用也非指针的那种...
C++中多态性的基石是:引用和指针的静态类型和动态类型可以不同。举个例子:Base *pB; \/\/ 那么我们说pB的静态类型是一个指向Base类型的指针,动态类型则可以是指向Base类型的指针或者指向Derived类型的指针。关于多态就不多解释了。与此同时,对象是非多态的。它是指对象的动态类型和静态类型总是相同。

c++和java的多态性的区别
多态是指用父指针指向不同子类对象时,调用其共有的函数,不同的子类会有不同的行为。虽然C++和Java都具有多态机制,但是他们的实现不同,使用时的效果也会略有不同 在C++中 普通函数调用:具体调用哪个方法在编译时就可以决定(通过查找编译器的符号表),同时在使用标准过程调用机制基础上增加一个表示...

C++中多态的作用?
c++中多态更容易理解的概念为 允许父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法。在C++中: classA{ public: A(){} virtualvoidfo... c++中多态更容易理解的概念为 允许父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法。在C++中: class A { ...

c++多态性是什么,有什么作用
简单地说就是子类里实现了父类的虚函数,父类的指针不仅可以调用自己的这个函数,同时也可以调用子类的这个虚函数,从而实现了多态。作用就是实现了动态联编,使程序运行效率更高,更容易维护和操作。

相似回答