我从以下代码中得到了意外的行为:
struct Base
{
Base() {}
virtual ~Base() {}
virtual void foo() const = 0;
protected:
Base(const Base &) {}
};
struct Derived : public Base
{
Derived() {}
Derived(const Derived &other) : Base(other) {}
virtual void foo() const {}
};
struct NewDerived
{
operator const Derived() { return Derived(); }
};
void func(const Base &b)
{
b.foo();
}
int main()
{
func(NewDerived());
return 0;
}
使用 MSVC2008,我在 main() 中得到这个编译错误:
error C2248: 'Base::Base' : cannot access protected member declared in class 'Base'
为什么它试图访问 Base 的复制构造函数?
如果我公开 Base 的复制构造函数,代码会在运行时编译并切片返回值,并且在 func() 中对 foo() 的调用会触发一个名为 error 的纯虚函数。
有人可以解释一下吗?