用cpp1.定义两个类:A和B,具有相同的变量x和问名的函数funsame);xsubAB继承A和B;在main中声明一个subAB的变量,调用funsame(),理解继承中的二义性,使用函数覆盖的方法解决问题。 2.定义A的子类subA,定义subAA继承A和subA,在main中声明一个subAA的变量,理解重复继承引起的二义性,并使用虚基类的方式解决问题。 3.在A和subA中添加构造函数和析构函数,输出提示;在main中声明一个A的指针apt,赋值为subA的对象 A apt = new subA 运行程序,查看析构函数的调用,使用虚析构函数,观察修改后的结果
时间: 2024-02-11 10:04:59 浏览: 64
练习1.cpp
好的,我将回答你的问题。
对于第一个问题,可以按照以下方式定义两个类A和B,以及它们的子类xsubAB:
```cpp
class A {
public:
int x;
virtual void funsame() {
cout << "This is A's funsame()." << endl;
}
A() {
cout << "Constructing A." << endl;
}
virtual ~A() {
cout << "Destructing A." << endl;
}
};
class B {
public:
int x;
virtual void funsame() {
cout << "This is B's funsame()." << endl;
}
B() {
cout << "Constructing B." << endl;
}
virtual ~B() {
cout << "Destructing B." << endl;
}
};
class xsubAB : public A, public B {
public:
void funsame() {
cout << "This is xsubAB's funsame()." << endl;
}
xsubAB() {
cout << "Constructing xsubAB." << endl;
}
~xsubAB() {
cout << "Destructing xsubAB." << endl;
}
};
```
注意,由于A和B都有一个名为x的变量和一个名为funsame()的函数,当它们被继承时,可能会出现二义性。因此,我们需要在xsubAB中使用函数覆盖的方法解决这个问题,即在xsubAB中重新定义funsame()函数。
在main函数中,我们可以声明一个xsubAB类型的变量,并调用它的funsame()函数:
```cpp
int main() {
xsubAB subAB;
subAB.funsame();
return 0;
}
```
运行程序,输出结果如下:
```
Constructing A.
Constructing B.
Constructing xsubAB.
This is xsubAB's funsame().
Destructing xsubAB.
Destructing B.
Destructing A.
```
可以看到,我们成功地解决了继承中的二义性,并且使用函数覆盖的方法成功地调用了xsubAB的funsame()函数。
对于第二个问题,我们可以按照以下方式定义A的子类subA和subAA:
```cpp
class subA : public A {
public:
subA() {
cout << "Constructing subA." << endl;
}
~subA() {
cout << "Destructing subA." << endl;
}
};
class subAA : public subA, public virtual A {
public:
subAA() {
cout << "Constructing subAA." << endl;
}
~subAA() {
cout << "Destructing subAA." << endl;
}
};
```
注意,在subAA中,我们使用了虚基类A,这样可以解决重复继承引起的二义性问题。此外,我们还可以在subA和subAA中添加构造函数和析构函数,并输出相应的提示。
在main函数中,我们可以声明一个subAA类型的变量,并调用它的funsame()函数:
```cpp
int main() {
subAA subaa;
subaa.funsame();
return 0;
}
```
输出结果如下:
```
Constructing A.
Constructing subA.
Constructing subAA.
This is A's funsame().
Destructing subAA.
Destructing subA.
Destructing A.
```
可以看到,我们成功地解决了重复继承引起的二义性,并且使用虚基类的方式成功地调用了A的funsame()函数。
对于第三个问题,我们可以在A和subA中添加构造函数和析构函数,并输出相应的提示:
```cpp
class A {
public:
int x;
virtual void funsame() {
cout << "This is A's funsame()." << endl;
}
A() {
cout << "Constructing A." << endl;
}
virtual ~A() {
cout << "Destructing A." << endl;
}
};
class subA : public A {
public:
subA() {
cout << "Constructing subA." << endl;
}
~subA() {
cout << "Destructing subA." << endl;
}
};
```
在main函数中,我们可以声明一个A的指针apt,赋值为subA的对象:
```cpp
int main() {
A* apt = new subA;
delete apt;
return 0;
}
```
注意,在删除apt时,我们需要调用虚析构函数,以确保正确地调用子类的析构函数。
输出结果如下:
```
Constructing A.
Constructing subA.
Destructing subA.
Destructing A.
```
可以看到,我们成功地使用了虚析构函数,并正确地调用了子类的析构函数。
阅读全文