C++ 为什么转换为纯虚拟基类的错误不会在编译阶段出现?

C++ 为什么转换为纯虚拟基类的错误不会在编译阶段出现?,c++,C++,我有一个人为的例子。我认为关键的一点是存在到基类的非法转换。我应该不能拥有MyBase的数组 此示例在我的VS2013计算机上编译: #include <vector> #include <iostream> struct MyBase { virtual size_t Count() = 0; }; struct MyContainer : MyBase { size_t Count() override; }; size_t MyContaine

我有一个人为的例子。我认为关键的一点是存在到基类的非法转换。我应该不能拥有MyBase的数组

此示例在我的VS2013计算机上编译:

#include <vector>
#include <iostream>

struct MyBase {
    virtual size_t Count() = 0;
};

struct MyContainer : MyBase {
    size_t Count() override;
};

size_t MyContainer::Count() {
    return 4;
}

int main() {
    MyContainer countable;
    MyBase x[] = { countable };
    std::cout << x[0].Count() << std::endl;
    return 0;
}
#包括
#包括
结构MyBase{
虚拟大小\u t Count()=0;
};
结构MyContainer:MyBase{
size\u t Count()覆盖;
};
大小\u t MyContainer::Count(){
返回4;
}
int main(){
MyContainer可数;
MyBase x[]={countable};

std::您的问题是
MyBase x[]
必须是一组引用或指针才能工作。不,我知道发生了什么。我的问题是,为什么这不是编译器错误,而是链接器错误。为了帮助人们回答您的问题,您需要更具体地说明错误。请在您的帖子中包含您从您的(最好使用复制+粘贴来避免转录错误)。您可能也希望标记为。就我(和GCC)所见,
x
的声明是错误的,因为
Count()
是纯虚拟的。如果我提供了一个实现,那么它会编译(因为编译器默认的复制构造函数(即对象切片)可以从
MyContainer
构造
MyBase
,并且程序可以正确输出
0
。它是链接器错误的原因可能是编译器没有诊断对
virtual MyBase::Count()的调用)
,但正在对其进行设备化。然后你的链接器希望找到它的定义。FWIW,
MyBase x[]
在GCC和Clang中都给了我编译错误,都说
x
的类型无效,因为该类是抽象的。这可能是Microsoft编译器中的错误。
int main() {
    MyContainer countable;
    MyBase * x[] = { &countable };
    std::cout << x[0]->Count() << std::endl;
    return 0;
}