Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
"class1" : dziedziczy klasę "class2::member" przez dominację
Uwagi
Co najmniej dwa elementy członkowskie mają taką samą nazwę.
class2 Element w elemencie jest dziedziczony, ponieważ jest klasą bazową dla innych klas, które zawierały ten składowy.
Aby pominąć C4250, użyj pragma ostrzeżenia .
Ponieważ wirtualna klasa bazowa jest współdzielona między wieloma klasami pochodnymi, nazwa w klasie pochodnej dominuje w nazwie w klasie bazowej. Na przykład, biorąc pod uwagę następującą hierarchię klas, istnieją dwie definicje func dziedziczone w obrębie diamentu: wystąpienie vbc::func() za pośrednictwem słabej klasy i dominujące::func() za pośrednictwem dominującej klasy. Niekwalifikowane wywołanie func() za pośrednictwem obiektu klasy diamentu zawsze wywołuje wystąpienie dominant::func(). Gdyby słaba klasa miała wprowadzić wystąpienie func(), żadna definicja nie dominuje, a wywołanie byłoby oflagowane jako niejednoznaczne.
Przykłady
Poniższy przykład generuje kod 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
}
Poniższy przykład generuje 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;
}
W tym przykładzie przedstawiono bardziej złożoną sytuację. Poniższy przykład generuje 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()
}