, 내 프로그램은 런타임에 어설 션 오류 트리거 : ... _CrtlsValidHeapPointer (pUserData),하지만 코드는 나에게 좋아 보이는 class A
{
int a;
public:
A();
A(int);
virtual ~A();
void setA(int);
int getA();
가상 기본 클래스에 관한 쿼리가 있습니다. 다중 상속에서 "죽음의 두려운 다이아몬드"/ 모호성 문제를 해결하기 위해 가상 기본 클래스가 도입되었습니다. 키워드 virtual가 class C 선언에 사용하지 않을 때 무슨 일이 일어날 지 class A { public: void Foo() {} };
class B : public virtual A {};
, 나는 다음과 같은 경고 및 오류 얻을 : test.cpp:15: warning: direct base 'B' inaccessible in 'D' due to ambiguity
test.cpp:15: error: no unique final overrider for 'virtual void A::f()' in 'D'
을하지만 A (즉 struct B
확인 이 : class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
내가 편집 B와 C 단 D의 방법이 없습니다, 나는이 작업을 수행 할 수있는 쉬운 방법은 무엇입니까?
다중 상속을 가진 클래스에서 데이터 멤버에 대한 포인터를 얻는 방법이 있는지 확인하려고합니다. 모호성을 제거하고 올바른 오프셋을 얻는 방법이 있습니까? struct Foo
{
int BarData;
};
struct FooBarBaseA : public Foo
{
int DataA;
};
struct FooBarBaseB :
C++의 다이아몬드 문제 (다중 상속)에 대한 해결책을 이해하려고합니다. 솔루션을 더 잘 이해하기 위해이 코드를 작성했지만 예상대로 작동하지 않습니다. 오류 C2385를 : #include <stdio.h>
class A
{
public:
void Print()
{
printf("A\n");
}
};
cla
다이아몬드 상속 관련 모호성 문제를 피하기 위해 기본 클래스에서 파생 될 때 가상 키워드 사용 요구 사항을 이해합니다. 하지만 내 질문은 이것이 다이아몬드 문제가있을 수도 있고 없을 수도있는 클래스를 파생시킬 때 C++의 기본 동작이 아닌 이유입니다. 다이아몬드 상속이없는 상황에서 '가상'키워드를 사용하면 '해가되는'것이 있습니까? 오버 헤드가있다
을 주셔서 감사합니다. 저는 C++의 소프트웨어 패턴을 익히 알고 인터페이스 기반 프로그래밍에 문제가 있습니다. 즉 다이아몬드 문제입니다. 여기에 상황이 있습니다 : Button 클래스에서 파생 된 Widget 클래스가 있고, 각각 고유 한 인터페이스 클래스가 있습니다. Widget 클래스는 foo 메서드를 가지며 Button 클래스는 Widget 메서드와