编译器警告(等级 2)C4250
“class1”:通过主导类继承“class2::member”
两个或更多成员同名。 继承 class2
中的类,因为它是包含此成员的其他类的基类。
使用警告 pragma 禁止 C4250。
因为虚拟基类在多个派生类之间共享,所以派生类中的名称决定基类中的名称。 例如,给定以下类层次结构,在菱形中继承的 func 有两个定义:通过弱类继承的 vbc::func() 实例,以及通过主导类继承的 dominant::func()。 通过菱形类对象对 func() 的非限定调用,始终调用dominant::func() 实例。 如果弱类要引入 func() 的实例,则任何定义都不会占主导地位,并且调用将标记为不明确。
示例
// C4250.cpp
// compile with: /c /W2
#include <stdio.h>
struct vbc {
virtual void func() { printf("vbc::func\n"); }
};
struct weak : public virtual vbc {};
struct dominant : public virtual vbc {
void func() { printf("dominant::func\n"); }
};
struct diamond : public weak, public dominant {};
int main() {
diamond d;
d.func(); // C4250
}
以下示例生成 C4250。
// C4250_b.cpp
// compile with: /W2 /EHsc
#include <iostream>
using namespace std;
class A {
public:
virtual operator int () {
return 2;
}
};
class B : virtual public A {
public:
virtual operator int () {
return 3;
}
};
class C : virtual public A {};
class E : public B, public C {}; // C4250
int main() {
E eObject;
cout << eObject.operator int() << endl;
}
此示例显示更复杂的情况。 以下示例生成 C4250。
// C4250_c.cpp
// compile with: /W2 /EHsc
#include <iostream>
using namespace std;
class V {
public:
virtual int f() {
return 1024;
}
};
class B : virtual public V {
public:
int b() {
return f(); // B::b() calls V::f()
}
};
class M : virtual public V {
public:
int f() {
return 7;
}
};
// because of dominance, f() is M::f() inside D,
// changing the meaning of B::b's f() call inside a D
class D : public B, public M {}; // C4250
int main() {
D d;
cout << "value is: " << d.b(); // invokes M::f()
}