mother
对象如何在对father
进行类型转换时调用son
的函数?
此处未创建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;
}
答案 0 :(得分:3)
您的代码具有未定义的行为,因为您尝试通过类型mother
访问类型为son
的对象,而 func registerLocal(sender: AnyObject) {
let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)
}
不是对象的动态类型。
更确切地说,标准中的[basic.lval]表示:
如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义: 56
- 对象的动态类型,
- 对象的动态类型的cv限定版本,
- 类似于对象的动态类型的类型
- 与对象的动态类型对应的有符号或无符号类型的类型
- 与对象的动态类型的cv限定版本对应的有符号或无符号类型的类型,
- 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(递归地,包括子聚合或包含联合的元素或非静态数据成员),
- 一种类型,它是对象动态类型的(可能是cv限定的)基类类型,
- char或unsigned char类型。
未定义的行为 - 对程序的行为没有任何限制。未定义行为的示例是数组边界外的内存访问,有符号整数溢出,空指针解除引用,在没有序列点的表达式中多次修改相同标量,通过不同类型的指针访问对象等。编译器不需要诊断未定义的行为(尽管诊断出许多简单的情况),并且编译的程序不需要做任何有意义的事情。
答案 1 :(得分:2)
取消引用类型son*
的指针,当它指向类型的对象或从son
派生时(即指向的对象具有不兼容的类型)具有未定义的行为。
为什么妈妈的对象能够......
行为未定义。