c++ - 头文件中未定义方法和纯虚方法的区别

标签 c++

与使用带有未定义成员的类声明相比,使用带有纯虚方法的类声明有哪些优点或缺点?示例:


纯虚函数

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;}
};

以便稍后您可以将 RockBanana 的实例称为 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/

相关文章:

c++ - 更好的事件处理机制?

python - 为 python 包装 c++ 类(使用 opencv),给出 "undefined symbol"

c++ - 在 BHO 中使用 HTMLDocumentEvents2 捕获 OnClick 事件时出现问题

c++ - 使用模板化方法将类作为 GCC 的模板参数传递

C++判断硬盘剩余空间

c++ - 是否可以定义 enumalpha?

c++ - 在并行 omp 循环中同时写入同一内​​存

C++ 使用 boost 对字符串进行标记并将标记保存为字符串

c++ - 如何使用在命名空间中声明的类实例的 vector

c++ - 生成随机 DAG