다중 상속에서 기대하지 않았던 결과, virtual
메소드 및 기본 클래스에 대한 포인터가 있습니다. d.getStr()
와다중 상속, 가상 메소드 충돌 및 기본 클래스의 포인터
, d
이 derived
예를 때 내가 예상대로 base_2
버전이 호출됩니다. 내가 예상대로 p
가 derived
예 (또는 derived
인스턴스를 가리키는 base_2
에 대한 포인터)에 대한 포인터가 p->getStr()
와
는 base_2
버전이 호출됩니다.
그러나 p
가 derived
인스턴스를 가리키는 base_1
에 대한 포인터가 p->getStr()
와
base_1
버전이 호출되고 I는
base_2
버전이라고 할 것이다 확신했다 (덕분
using
및
getStr()
이
virtual
방법이 있다는 사실) .
다음의 간단한 예입니다 :
#include <iostream>
struct base_1
{
virtual std::string getStr() const
{ return "string from base 1"; }
};
struct base_2
{
virtual std::string getStr() const
{ return "string from base 2"; }
};
struct derived : public base_1, public base_2
{
using base_2::getStr;
};
int main()
{
derived d;
derived * dp = &d;
base_1 * bp1 = &d;
base_2 * bp2 = &d;
std::cout << "from derived: " << d.getStr() << std::endl;
std::cout << "from derived pointer: " << dp->getStr() << std::endl;
std::cout << "from base_1 pointer: " << bp1->getStr() << std::endl;
std::cout << "from base_2 pointer: " << bp2->getStr() << std::endl;
}
출력 인
내가base_2
버전의 전화를 부과하는 것을 알고
from derived: string from base 2
from derived pointer: string from base 2
from base_1 pointer: string from base 1
from base_2 pointer: string from base 2
, 내가 derived
다음과 같은 방법으로 추가 할 수 있습니다 다음
std::string getStr() const
{ return base_2::getStr(); }
제 질문은 :
1) base_1
(파생 된 인스턴스를 가리키는)에 대한 포인터가 using
지시어를 무시하고 base_1
버전을 getStr()
이라고 부르는 이유는 무엇입니까?
2) getStr()
의 base_2
버전을 부과 할 수있는 방법이 있나요, derived
인스턴스가 getStr()
을 재정의하지 않고 base_1
포인터로 사용됩니까?
--- 편집 --- 답변에 대한
감사합니다.
나는 당신이 무슨 일이 일어나고 있는지 설명하고 있지만 나의 의심은 이해합니다 : 언어 (표준)가이면을 묘사합니까? 아니면 정의되지 않은 부분입니까?
는 말 : 나는 using
지시어를 제거하면 컴파일러가 선택하는 getStr()
의 버전을 알 수 없어 나는 d.getStr()
에서와 dp->getStr()
에서 컴파일 오류 (error: request for member getStr is ambiguous
)를 얻는다.
그러나 getStr()
은 virtual
입니다. 그래서 (나는 확신했다.) 기본 포인터는 파생 된 버전을 사용해야한다. 그러나 우리는 몇 가지 충돌하는 방법을 가지고 있습니다.
base_1
(또는 base_2
)은 충돌 메서드의 두 버전 중 하나를 선택하는 권한이 부여 된 (또는 의무가있는) 포인터입니까?
아마도 내가 틀렸지 만, 이런 식으로 virtual
메서드는 virtual
메서드로 관리됩니다.
'using '은 가시성을 돕습니다. 그것은 파생 된'overload'를 기본 가상 함수로 보이게 만들지 않습니다. – Arunmu