与使用带有未定义成员的类声明相比,使用带有纯虚方法的类声明有哪些优点或缺点?示例:
纯虚函数
TestClass.h
namespace test {
class TestClass {
virtual void DoSomething() = 0;
}
}
TestClass.cpp
namespace test {
class TestClassImpl : public TestClass {
void DoSomething() {
std::cout << "Hello!" << std::endl;
}
}
}
未定义的方法
TestClass.h
namespace test {
class TestClass {
void DoSomething();
}
}
TestClass.cpp
namespace test {
void TestClass::DoSomething() {
std::cout << "Hello!" << std::endl;
}
}
我知道 C++ 中的虚函数调用会由于间接和额外的分支而产生开销,但目前这些开销与我无关。我对拥有可扩展的正确代码更感兴趣(仅供引用:我是 C++ 新手,但不是编程新手)。
最佳答案
它们的用途完全不同,因此您不应一视同仁或尝试比较它们。
纯虚方法意味着派生类必须自己实现该方法才能使其完整。这通常会像这样使用:
对象.hpp
class Object{
public:
virtual void use() = 0;
};
class Banana: public Object{
public:
void use(){std::cout << "You ate the Banana! Good work." << std::endl;}
};
class Rock: public Object{
public:
void use(){std::cout << "You use the Rock. Nothing happens." << std::endl;}
};
以便稍后您可以将 Rock
或 Banana
的实例称为 Object
并且知道它们将有一个 使用
函数。
例如
main.cpp
#include "Object.hpp"
int main(){
std::vector<Object*> objects;
Banana banana;
Rock rock;
objects.push_back(&banana);
objects.push_back(&rock);
for(const Object *o : objects)
o->use();
}
如果您决定不使用虚函数,那么您就不能将对象视为 Object
本身。
例如
main.cpp
class Banana{
public:
void use();
};
class Rock{
public:
void use();
};
int main(){
std::vector<???> objects;
Banana banana;
Rock rock;
objects.push_back(&banana); // can't do
objects.push_back(&rock); // or this
for(const ??? *o : objects)
o->use(); // and definitely not this
}
如果您尝试通过将函数的实现委托(delegate)给不同的代码单元来做到这一点,那么,我不知道您会尝试做什么。
你实际上可以在另一个文件中实现你的虚函数,只要你实现了它们;否则,当您尝试将此类对象作为 Object
访问时,您会遇到错误。
在处理库和非常大的项目时,您可能希望使用具有外部实现的函数。您这样做是为了每次翻译代码时都不必再次编译该函数,只需调用已实现的代码即可:D
这大大缩短了构建时间。
关于c++ - 头文件中未定义方法和纯虚方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23444502/