'class1' : 透過支配繼承 'class2::member'
備註
兩個以上的成員具有相同的名稱。 中的 class2 一個是繼承的,因為它是包含這個成員之其他類別的基類。
若要隱藏 C4250,請使用 警告 pragma。
因為虛擬基類在多個衍生類別之間共用,衍生類別中的名稱主宰基類中的名稱。 例如,假設下列類別階層,在菱形中繼承的 func 有兩個定義:vbc::func() 實例透過弱式類別繼承,而主要類別則為::func() 。 透過菱形類別物件呼叫 func() 的不合格呼叫,一律呼叫主宰::func() 實例。 如果弱式類別要引入 func()的實例,則兩個定義都不會佔據主導地位,而且呼叫會標示為模棱兩可。
範例
下列範例會產生 C4250:
// 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()
}