올바른 사용 다중 상속 - 제 53 다중 상속 (아래)를 포기

다중 상속 엔지니어링 개발 :(이) 객체 지향 접근 방법의 이론이 좋습니다
단일 상속 + 클래스 (이상) 인터페이스를 구현

 

 

사용법 #include <iostream> 
사용법 #include < 문자열 >

사용하는  네임 스페이스 표준을;

수업 자료
{
보호 :
     INT 마일;
공공 :
    자료 ( INT I)
    {
        용액은 = I를;
    }
    INT의 동요 ()
    {
        반환 마일;
    }
    bool에 동일 (기본 * OBJ)를
    {
        리턴 (  == OBJ);
    }
};

클래스 인터페이스 1
{
공개 :
     가상  공간 추가 ( INT I) = 0 ;
    가상  공간 마이너스 ( INT I) = 0 ;
};

클래스 Interface2
{
공개 :
     가상  공간 다중 ( INT I) = 0 ;
    가상  공간 분할 ( INT I) = 0 ;
};

클래스 파생 : 공개 자료, 공중 인터페이스 1, 공공 Interface2는 // 보기의 모양 지점에서, 그것은 C ++ 다중 상속 여전히 있지만,보기의 의미 론적 관점에서, 이것은 다중 상속하지 않습니다.
                                                                  // 단일 상속 여러 인터페이스 + 
{
 공개 :
    (파생 하는 int I) : 자료 (I)
    {
    }
    보이드 추가 ( INT I)
    {
        용액 + = I;
    }
    보이드 마이너스 ( INT I)
    {
        용액 - = I;
    }
    무효화 곱셈 ( INT I)
    {
        용액 * = I;
    }
    공간 분할 ( INT I)
    {
        경우 (I! = 0 )
        {
            용액 / = I;
        }
    }
};

int 형 ) (주
{
    파생 D ( 100 );
    파생 * p = & D;
    인터페이스 1 * = pInt1 & D;    // 할당 호환성 원리 
    Interface2 pInt2 * = & D;

    COUT << " P-> GETI () = " << P-> GETI () << ENDL;    // 100 

    pInt1 -> 추가 ( 10 );
    pInt2 -> 분할 ( 11 );
    pInt1 -> 마이너스 ( 5 );
    pInt2 -> 곱셈 ( 8 );

    COUT << " P-> GETI () = " << P-> GETI () << ENDL;    // 40 

    COUT << ENDL;

    COUT << " pInt1 == P : " << P-> 같음 (dynamic_cast는 <이 자료 *> (pInt1)) << ENDL는; //는 , 기억해야하며, 가상 함수 캐스트 관련된 상속 관련 dynamic_cast는 용으로 사용해야 
    COUT << " pInt2 == P : " << P-> << (dynamic_cast는 <자료 *> (pInt2)의) 동일한 ENDL;

    반환  0 ;
}

在父类中添加一个成员函数,用于解决在多继承的情况下指向同一个对象的多个指针它们的值不一样。
定义接口class Interface1、class Interface2这样的方式是工程中常用的一种解决方案。
但是class Derived : public Base, public Interface1, public Interface2 表象还是多重继承,同一个子类继承了多个父类。
在这里我们使用了多个接口,必然在Interface1和Interface2中有虚函数。既然有虚函数,又与继承相关,就可以借助dynamic_cast这个关键字。有了这个关键字,编译器就会为我们重新计算指针的值,这样就可以在一定程度上避免:在多继承发生的情况下,指向同一个对象的指针值可能不同。
工程是如何来做的呢?
在顶层的父类那个地方,定义一个成员函数equal,用来判断参数指针是不是指向当前的对象。

使用方式,见main函数

如果在main函数中,不使用dynamic_cast关键字:

int main()
{
    Derived d(100);
    Derived* p = &d;
    Interface1* pInt1 = &d;   //赋值兼容性原则
    Interface2* pInt2 = &d;

    cout << "p->getI() = " << p->getI() << endl;    // 100

    pInt1->add(10);
    pInt2->divide(11);
    pInt1->minus(5);
    pInt2->multiply(8);

    cout << "p->getI() = " << p->getI() << endl;    // 40

    cout << endl;

    cout << "pInt1 == p : " << p->equal(pInt1) << endl;
    cout << "pInt2 == p : " << p->equal(pInt2) << endl;

    return 0;
}

出现下面的错误:

一些有用的工程建议
-先继承一个父类,然后实现一个接口
-父类中提供equal()成员函数
-equal成员函数用于判断指针是否指向当前对象
-与多重继承相关的强制类型转换用dynamic_cast完成

小结:
多继承中可能出现多个虚函数表指针
与多重继承相关的强制类型转换用dynamic_cast完成
工程开发中采用单继承多接口的方式使用多继承
父类提供成员函数用于判断指针是否指向当前对象

추천

출처www.cnblogs.com/-glb/p/11968397.html