作者WGL (飞扬寒星)
看板NTUEE113HW
标题Re: [问题] 继承函式的呼叫
时间Tue Jan 12 22:04:45 2010
先感谢一下REPO的帮助!!只是我还有一点疑惑,还请多多包涵Orz....
※ 引述《seanlatias (小赖)》之铭言:
有问题的code: (请善用置底文标色功能)
#include <iostream>
using namespace std;
class AA
{
public:
AA()
{
printf("1");
}
virtual void F1()
{
printf("2");
}
void F2()
{
printf("3");
}
~AA()
{
printf("4");
}
};
class BB : public AA //BB继承AA
{
public:
BB()
{
printf("5");
}
virtual void F1()
{
printf("6");
}
void F2()
{
printf("7");
}
~BB()
{
printf("8");
}
};
int main()
{
AA v1; // 1
v1.F1(); // 2
v1.F2(); // 3
BB v2; // 4
v2.F1(); // 5
v2.F2(); // 6
AA *v3 = new BB(); // 7
v3->F1(); // 8
v3->F2(); // 9
delete v3; // 10
BB *v4; // 11
// v4->F1(); // 12,不能执行
v4->F2(); // 13
BB *v5 = new BB(); // 14
v5->F1(); // 15
v5->F2(); // 16
delete v5; // 17
system ("pause");
return 0;
}
说明:
这是某位大大的PO文,可是有些问题还是不太懂想请教一下
先是注解编号4,7,14,因为我学到的是继承的derived class不会自动继承base class
的constructor,也就是只显示“5”,可是为何显示“15”?
虽然不会继承但是会呼叫到
可是课本上都是用member initializer去呼叫,这样不会重覆吗?(实际测试不会)
再来就是注解10,delete V3时,因为V3指向的是BB的object,所以照理说应该会显示
“8”,可是结果却显示“4”,我只知道没有virtual的function会执行base class的
但是为何destructor也这样?难道要把destrucor也virtual?(好像不行)但是
constructor却是有执行derived class的啊……
因为宣告的是AA的pointer啊!
如果有呼叫constructor就会呼叫destructor,那应该也会呼叫BB的destructor啊@@
还有注解13,v4明明没有指向任何object但是为何会印出“7”?是virtual的关系?
那virtual不就和static效果一样了?另外我在试的时候virtual和static不可以同时加
是否也是这个原因??
我家的不能compile耶!
请问你是用VC?还是DevC++?
最後就是程式结束的时候,照理说注解17只会印出“8”却印出了“84”……
在system("pause")後也印出了“844”……本以为destroy v2和v1时只会印出84……
有呼叫constructor就会呼叫destructor
--
我宁以顷刻短暂的繁华,换取千年无尽的落寞。
欢迎大家上我的“部落格”:
http://coldstar.5d6d.com/forum-2-1.html
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.241.120
1F:推 seanlatias:针对第一个问题,课本上是说用member intializer。但是 01/12 22:11
2F:→ seanlatias:我想如果没有member initializer就会主动呼叫base cons 01/12 22:12
3F:→ seanlatias:tructor 01/12 22:12
4F:→ WGL:个人是认为如果base constructor有要传入东西就不会自动呼叫吧 01/12 22:15
5F:→ seanlatias:第二个问题,我更正一下我的说法好了 01/12 22:15
6F:→ seanlatias:可以试试 01/12 22:16
7F:→ seanlatias:我猜程式会出问题 01/12 22:16
8F:→ seanlatias:的确,会出问题(不能compile) 01/12 22:26
9F:→ WGL:TO楼上:可是CandCPP版上的人说有virtual destructor这种东西. 01/12 22:47
10F:→ WGL:如果你说的是base constructor那个,的确会出问题 01/12 22:48
11F:→ WGL:-In constructor `BB::BB(int)': 01/12 22:49
12F:→ WGL:-no matching function for call to `AA::AA()' 01/12 22:49
13F:→ WGL:它还是会忠实地自动呼叫= = 01/12 22:50