C++ 为什么';这不提供多定义错误吗?
为了方便起见,我曾经内联编写虚拟析构函数的定义,尽管它并不正确。今天我决定做一个小测试来了解发生了什么 哑巴C++ 为什么';这不提供多定义错误吗?,c++,destructor,C++,Destructor,为了方便起见,我曾经内联编写虚拟析构函数的定义,尽管它并不正确。今天我决定做一个小测试来了解发生了什么 哑巴 #ifndef DUMMY_HEADER #define DUMMY_HEADER #include <iostream> class Dummy { public: virtual ~Dummy() {std::cout << "dummy destroyed" << std::endl;} }; class DummyEx :
#ifndef DUMMY_HEADER
#define DUMMY_HEADER
#include <iostream>
class Dummy
{
public:
virtual ~Dummy() {std::cout << "dummy destroyed" << std::endl;}
};
class DummyEx : public Dummy
{
public:
virtual ~DummyEx() {std::cout << "DummyEx destroyed" << std::endl;}
};
#endif
main.cpp
#include "dummy.h"
void deleteDummy(Dummy* dummy);
int main()
{
Dummy* dummy = new DummyEx();
delete dummy;
dummy = new DummyEx();
deleteDummy(dummy);
return 0;
}
我用g++-c deleter.cpp
编译了deleter.cpp
,得到了deleter.o
我用g++-c main.cpp
编译了main.cpp
,得到了main.o
我用g++deleter.o main.o
链接了对象文件,得到了a.out
当我执行a.out
时,输出与预期一样,来自Dummy
和DummyEx
析构函数的两个cout都在那里
但是,编译后的析构函数定义指向哪个对象文件?它们不可能同时指向两个对象文件,因为我在链接时没有收到多定义错误。此外,编译器也没有内联析构函数,因为虚拟函数被正确调用。,所以在链接时不会遇到“多个定义”错误。这些定义是隐式
内联的,允许多个定义存在,只要它们在词汇上相同。一个定义规则不适用于内联函数。析构函数是隐式内联的。语言规范只是说这必须起作用。你是在问编译器/链接器是如何做到这一点的吗?ODR确实适用于内联函数,但它规定如果有多个定义,它们必须具有完全相同的定义。任何内联函数都可以在多个对象文件中具有定义,只要它们相同?如果是的话,它解释了这一点。
#include "dummy.h"
void deleteDummy(Dummy* dummy);
int main()
{
Dummy* dummy = new DummyEx();
delete dummy;
dummy = new DummyEx();
deleteDummy(dummy);
return 0;
}