这是一篇简答的小文章,主要目的说明小知识点,我们使用C++类列表初始化的时候,如果使用到初始化的值是基类,而我们new的实例是子类的,如何实现呢:
#include <memory>
#include <iostream>
class cBase
{
public:
int m_a;
int m_b;
};
class cSub : public cBase
{
public:
cSub(int a, int b) :m_a(a), m_b(b) {}
};
int main()
{
cBase *p = new cSub(1, 2);
std::cout << p->m_a << " " << p->m_b << std::endl;
std::getchar();
return 0;
}
这段代码编译就会有问题,会提示
error C2614: “cSub”: 非法的成员初始化:“m_a”不是基或成员
这就是因为你不能继承类中,生成实例的时候,直接把基类的变量给初始化了,那怎办,两个办法:
1:将基类的变量放到子类,这当然可以,但有违设计初衷啊。
2:将子类构造时,显式构造基类,如下:
class cBase
{
public:
int m_a;
int m_b;
};
class cSub : public cBase
{
public:
// cSub(int a, int b) :m_a(a), m_b(b) {}
cSub(int a, int b) :cBase{a, b} {}
};
这个就可以实现了,为了更完美,我一般会优化成智能指针实现更好,完整代码如下:
#include <memory>
#include <iostream>
class cBase
{
public:
int m_a;
int m_b;
};
class cSub : public cBase
{
public:
// cSub(int a, int b) :m_a(a), m_b(b) {}
cSub(int a, int b) :cBase{a, b} {}
};
int main()
{
std::unique_ptr<cBase> p = std::make_unique<cSub>(1, 2);
std::cout << p->m_a << " " << p->m_b << std::endl;
std::getchar();
return 0;
}
总结:
1:智能指针,列表初始化等,都是C++基操了,必须反复练习,熟练再熟练
2:遇到问题不能回避(如上的方法1),现在有chatgpt和newing大神在,啥问题都好解决。但多练还是非常必要的