2017-12-24 1 views
0

컴파일러가 계속됩니다 'class A' has no member named 'foo'. 포인터를 사용하여 파생 클래스의 함수를 사용하려고합니다. 내가 컴파일러 오류가 발생하고기본 클래스에서 포인터로 C++ 액세스 파생 클래스

Table[j]->foo() 

을하려고 할 때 내가 Table와 이름 A 포인터의 테이블이

class A{ 
    ..... 
}; 

class B:public A{ 
    virtual void foo() = 0; 
}; 

class C:public B{ 
.... 
public: 
    void foo(){ 
     .... 
    } 
}; 

: 여기 내 코드입니다.

캐스트 이외의 경우 어떻게해야합니까?

+2

가 A''에 순수 가상 함수를 이동 인쇄 할 수 있나요? 이것이 실제로 다형 적으로 사용하려고 시도하는 유형입니다. – StoryTeller

+0

'A' 클래스에는'foo()'라는 멤버 함수가 없기 때문에. –

+0

하지만 클래스 B가 foo() 함수를 갖고 싶지 않다. – Jokk

답변

2

A 함수에 foo이 선언되어 있지 않으므로 컴파일 오류가 발생했습니다.

는이 같은 A에서이 같은 순수 가상 선언 할 수 있습니다 : 파생 클래스에서

class A { 
    virtual void foo() = 0; 
}; 

당신이 명시 적으로 virtualfoo를 선언 할 필요가 없습니다. C이 콘크리트 클래스 인 경우 foo을 클래스 B에 전혀 선언 할 필요가 없습니다.

귀하의 예를 들어 당신이 포인터의 배열에 당신은 당신이 명시 적으로 C에 포인터를 캐스팅 할 수 클래스 C의 인스턴스를 A 것을 알고 있지만 그것은 가난한 디자인의 표시이고, 나는 그것을 권장하지 않는 경우 경우 :

static_cast<C*>(Table[j])->foo() 
0

당신도, 그 기초에 대한 포인터를 가지고 당신이 파생 된 유형에 대한 포인터를 가지고 그래서 캐스팅이 파생 된 유형의 멤버에 액세스하려는 경우 또는 귀하의 경우 같은 것은 가상으로 foo() 추가 회원을 기지에.

class A 
{ ... }; 
class B : public A:{ 
{ 
public: 
    virtual foo() { std::cout << "B::foo" << std::endl; } 
}; 
class C : public B 
{ 
public: 
    void foo() { std::cout << "C::foo" << std::endl; 
}; 
... 
A * arr[8]; 
for(int i = 0; 8>i; ++i) 
    arr[i] = new C; 
((B*)arr[0])->foo(); // will print "C::foo\n" 

하지만 Avirtual void foo() = 0;을 추가 한 경우 다음 당신은 arr[0]->foo()하고 여전히 C::foo

+2

"Aaarrrrrggghhh"그 C 스타일의 캐스트. 여기에'static_cast' 또는'dynamic_cast'를 사용하지 않을 이유가 없습니다. – Quentin

관련 문제