gpt4 book ai didi

c++ - 派生类使用抽象类的方法

转载 作者:行者123 更新时间:2023-11-27 23:40:20 26 4
gpt4 key购买 nike

我有一个抽象基类,看起来像这样:

class AbstractClass {
public:
virtual ~AbstractClass() = 0 {}
std::string GetName() const { return m_Name; }
private:
std::string m_Name;
};

现在我有很多派生类,我想像这样实现它们

class DerivedClass1 : public AbstractClass{
public:
DerivedClass1() = default;
~DerivedClass1() = default;
private:
std::string m_Name = "DerivedClass1";
};


int main() {
DerivedClass1 class1;
std::cout << class1.GetName();

return 0;
}

我不想每次派生类时都重写 GetName(),这可能吗?编辑:我收到链接器错误。错误 LNK2019。

最佳答案

只使用一个名字,在基类中,和一个带参数的构造函数:

class AbstractClass{
public:
AbstractClass(const std::string& name) : m_Name(name){}
std::string GetName() const { return m_Name; }
private:
std::string m_Name;
};



DerivedClass1 : public AbstractClass{
public:
DerivedClass() : AbstractClass("DerivedClass1") {}
};


int main(){
DerivedClass1 class1;
std::cout << class1.GetName();

return 0;
}

似乎没有理由将基类抽象化,但是如果您确实需要它,那么即使是纯虚拟析构函数也必须有一个定义,否则您将得到一个链接器错误,因为它是销毁派生对象时需要。
另外,如果析构函数不存在,m_Name 什么时候被销毁?

class Abstract
{
public:
virtual ~Abstract() = 0;
};

Abstract::~Abstract() {}

这使得一个类不能被实例化,但是它的派生类仍然可以被销毁。

关于c++ - 派生类使用抽象类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55593988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com