C++ 继承同名Impl简单测试构造顺序析构顺序
/*****class Base*****/
class Base
{
public:
Base();
virtual ~Base();
protected:
struct Impl;
Impl* m_Impl;
};
struct Base::Impl
{
int num{ 100 };
};
Base::Base()
{
m_Impl = new Impl;
std::cout << "Base 构造!" << '\n';
}
Base::~Base()
{
if (m_Impl)
{
delete m_Impl;
m_Impl = nullptr;
std::cout << "Base 析构!" << '\n';
}
}
/********class A*********/
class A :public Base
{
public:
A();
~A();
void say();
protected:
struct Impl;
Impl* m_Impl;
};
struct A::Impl
{
std::string name{ "A dog man!" };
};
A::A()
{
m_Impl = new Impl;
std::cout << "A 构造!" << '\n';
}
A::~A()
{
delete m_Impl;
std::cout << "A 析构!" << '\n';
}
void A::say()
{
std::cout << "A say:" << '\n';
std::cout << m_Impl->name << endl;
std::cout << Base::m_Impl->num << endl;
std::cout << '\n';
}
/********class B*********/
class B :public A
{
public:
B();
~B();
void say();
protected:
struct Impl;
Impl* m_Impl;
};
struct B::Impl
{
std::string info{ "B is SB!" };
};
B::B()
{
m_Impl = new Impl;
std::cout << "B 构造!" << '\n';
}
B::~B()
{
delete m_Impl;
std::cout << "B 析构!" << '\n';
}
void B::say()
{
std::cout << "B say:" << '\n';
std::cout << m_Impl->info << endl;
std::cout << A::m_Impl->name << endl;
std::cout << Base::m_Impl->num << endl;
std::cout << '\n';
}
int main()
{
B* b = new B;
std::cout << "-----分割-----" << '\n';
b->say();
std::cout << "-----分割-----" << '\n';
b->A::say();
delete b;
system("pause");
return EXIT_SUCCESS;
}
输出:
Base 构造!
A 构造!
B 构造!
-----分割-----
B say:
B is SB!
A dog man!
100
-----分割-----
A say:
A dog man!
100
B 析构!
A 析构!
Base 析构!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-09-13 设计模式对应的解释
2022-09-13 C# 适应环境的换行 Environment.NewLine
2021-09-13 WPF DataTrigger 改变控件颜色