2017-02-09 58 views
1

mother对象如何在调用类型为son时能够调用father的函数?带多重继承的C++类型转换

这里的father对象没有创建,那么如何来调用drive()函数。对于新手的问题抱歉。

#include <iostream> 
using namespace std; 

#include <iostream> 
using namespace std; 
class father 
{ 
    public: 
    void drive(){cout<<"Driving";} 
}; 
class mother 
{ 
    public: 
    void cook(){cout<<"Cooking";} 
}; 
class son: public father, public mother 
{ 

}; 
int main() { 
    // your code goes here 
    mother *m = new mother(); 
    son* s = static_cast<son *>(m); 
    s->drive(); 
    return 0; 
} 
+2

使用旧stlye强制转让给你没有办法验证你得到 – doctorlove

+1

这是非法的。它可能会出现**工作,但它不会。 – BoBTFish

+1

@Coder'(son *)'强制编译器接受它自己不会“推断”的内容。 – Scheff

回答

2

解引用son*类型的指针时,它不指向类型的对象或从son(即,尖锐的物体具有不兼容的类型)衍生的有未定义的行为。

为什么母亲对象可以...

行为是不确定的。

3

您的代码具有未定义的行为,因为您尝试通过类型son访问类型为mother的对象,该对象不是该对象的动态类型。

更精确地,[basic.lval]在标准表示:

如果一个程序试图通过的其他一个glvalue比以下类型的行为是未定义的一个访问对象的存储值:

  • 动态类型的对象,
  • 动态类型的对象的CV-合格版本,
  • 类型类似于动态类型的对象,
  • 一种类型,是有符号或对应的动态对象的类型无符号类型,
  • 在所述签名或对应于无符号CV-类型的类型该对象的动态类型的合格版本,
  • 聚合或联合类型,其中包括上述类型之一的元素或非静态数据成员(包括递归,元素或非静态数据成员的子集或包含的联合),
  • 一种类型,它是该对象的动态类型的(可能是CV-合格的)基类类型,
  • char或unsigned char类型。

报价cppreference.com

未定义行为 - 有对程序的行为没有任何限制。未定义行为的例子是数组边界之外的内存访问,有符号整数溢出,空指针取消引用,在没有序列点的表达式中多次修改相同标量,通过不同类型的指针访问对象等。编译器不需要诊断未定义的行为(虽然诊断了许多简单情况),编译后的程序不需要做任何有意义的事情。