.cpp 文件中的虚拟 C++ 方法实现是不是应标记为虚拟?

Posted

技术标签:

【中文标题】.cpp 文件中的虚拟 C++ 方法实现是不是应标记为虚拟?【英文标题】:Should a virtual c++ method implementation in .cpp file be marked virtual?.cpp 文件中的虚拟 C++ 方法实现是否应标记为虚拟? 【发布时间】:2014-11-05 23:36:32 【问题描述】:

我有一个在 .h 文件中定义并在 .cc 文件中实现的虚拟 C++ 方法。 .cc 文件中的实现应该标记为虚拟的,还是只是 .h 文件中的声明?例如,我的标题有:

virtual std::string toString() const;

方法在我的.cc中实现:

std::string
MyObject::toString() const 
   [implementation code]

应该将实现标记为虚拟,还是上面的代码可以?有关系吗?

【问题讨论】:

将实现标记为虚拟是非法 你的编译器甚至给你一个选择吗?如果是这样,哪个编译器? @GiulioFranco 嗯,有人因此被捕吗? 【参考方案1】:

C++ 标准 n3337 § 7.1.2/5 说:

虚拟说明符只能在初始声明中使用 非静态类成员函数;

关键字virtual只能在类定义中使用,当你声明(或定义)方法时。所以......它可以在实现文件中使用,但如果它仍在类定义中。

例子:

class A 
    public:
    virtual void f();
;

virtual void A::f()   // error: ‘virtual’ outside class declaration
                        // virtual void A::f() 

int main() 
    // your code goes here
    return 0;

http://ideone.com/eiN7bd

【讨论】:

非常感谢(以及其他在主线程上回复的人)。我应该在问之前阅读标准。 :)【参考方案2】:

根据 C++ 标准(7.1.2 函数说明符)

5 虚拟说明符应仅在开头使用 非静态类成员函数的声明

【讨论】:

以上是关于.cpp 文件中的虚拟 C++ 方法实现是不是应标记为虚拟?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 g++ 获取 C++ 头文件 (.hpp) 的汇编代码?

C++的.cpp文件

防止 C++ 中的虚拟方法实现

cpp 文件中的 C++ 变量能否定义为特殊符号 β

C++工程中如何在一个文件中调用另一个文件中的变量

QT C++,如何在在一个CPP里直接调用到另一个CPP里的函数