VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1738|回复: 11

C++对象模型问题

[复制链接]

2

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-1-19 17:20:01 | 显示全部楼层 |阅读模式
关于class object的析构, 我有下面的疑问:
class A
{
public:
    virtual void Say(){        cout<< "A" <<endl;        }
    ~A(){};

};
class B :public A
{
public:
        virtual void Say(){cout<< "B" <<endl;        }
        ~B(){}
};
class C:public B
{
public:
        virtual void Say(){cout<< "C" <<endl;        }
        ~C(){}
};
int main()
{       
        C *p = new C;
        p->Say();     //调用C::SAY()
        p->~C();      //照原书说法, *p成为一个B的object
        p->Say();     //应该调用B::SAY, 但实际调用A::SAY, 下面都是A::SAY
        p->B::~B();
        p->Say();
        p->A::~A();
        p->Say();

        return 0;
}
难道是在~C()中就调用了~B()?  而~B()中又调用了~A()?
而不是先调用~C()再调用~B(), ~A()?
又或者是编译器自己决定如何实现?
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-26 23:27:01 | 显示全部楼层
C++语言标准中,对这个问题也是这样递归描述的。
除了虚拟继承的之外,每个类的构造和析构函数仅仅需要分别调用该类直接的父类的构造和析构。
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-27 06:18:01 | 显示全部楼层
C++语言标准中,对这个问题也是这样递归描述的。
除了虚拟继承的情况比较复杂之外,每个类的构造和析构函数仅仅需要调用它的直接基类的构造和析构函数。
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-27 14:00:02 | 显示全部楼层
因为虚函数的调用是在程序运行时能过虚表找到了的,而非虚函数调用则是在编译时就确定了的。
这一点除了构造函数,任何函数都一样的啊,又不仅仅虚构函数,楼主哪里不明白了?呵呵。
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-27 16:00:01 | 显示全部楼层
delete有两步动作:
(1)调用析构函数;
(2)释放内存(即调用operator delete,注意是:“operator delete”,不是说上面这个delete本身)

而对于第一步,它当然也是个函数调用,遵守函数调用的所有规则,至少同样是虚函数动态绑定,非虚函数静态绑定。
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-28 09:00:02 | 显示全部楼层
呵呵,那里应该是举一个“以静态方式调用destructor”的例子,而不是说“所有对于destructor的调用都是静态方式的”。

一样的呀,普通虚函数也可以通过静态方式调用,比如那种:
p->A::f();
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-28 10:27:01 | 显示全部楼层
以后别说页码,说章节,hoho。
偶手里没中文版。- -b
回复

使用道具 举报

0

主题

41

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-1-28 10:54:01 | 显示全部楼层
virtual是为了能够通过基类的虚表来找到具体派生类的析构函数。
回复

使用道具 举报

2

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-2-6 23:45:01 | 显示全部楼层
那我再接着问一下:

当基类的析构函数是virtual时, 派生类的析构函数即使不声明为virtual, 应该也是虚的吧?
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-2-14 12:15:02 | 显示全部楼层
呵呵。是的。这一点跟一般函数也是一个道理。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表