0

基底クラスから非公開で派生クラスを継承すると、継承したクラスのポリモーフィズムを取得できません。

しかし、派生クラス内で「this」ポインターのポリモーフィズムを取得できます。

'this' ポインターがそのプライベートな親へのポリモーフィズムを許可されている理由について非常に興味がありますが、クラス外のポインターは許可されていません。

前もって感謝します!

#include <iostream>

class Shape
{
public:
    virtual void say() const = 0;
    virtual void who()
    {
        std::cout << "Shape" << std::endl;
    }
    void whoAmI() {
        this->who();
    }
};

class Squire : private Shape
{
public:
    virtual void say() const
    {
        std::cout << "Squire" << std::endl;
    }
    
    void doSay()
    {
        // why this pointer to Shape type is allowed in class?
        privateSay(this);
    }
    
private:
    void privateSay(Shape* s)
    {
        s->say();
    }
};

void say(Shape* s)
{
    s->say();
}

int main(int argc, const char * argv[]) {
    // insert code here...
    
    Squire* s = new Squire();
    // allowed
    s->doSay();
    
    // not allowd, compile errors
    // Cannot cast 'Squire' to its private base class 'Shape'
    say(s);
    
    return 0;
}

=========

明確にするために編集します。すべての答えをありがとう。私の質問を明確にするために、C ++がこの動作を許可している場合、カプセル化に少し違反していると思います。

より明確なケース:

#include <iostream>

class Base
{
public:
    void baseFunc() const
    {
        std::cout << "baseFunc" << std::endl;
    }
};

class Worker
{
public:
    Worker(Base *pBase)
    {
        base_ = pBase;
    }
    
    void breakFunc() const
    {
        base_->baseFunc();
    }
private:
    Base *base_;
};

class Derived : private Base
{
public:
    void init()
    {
        worker_ = new Worker(this);
    }
    
    Worker* getWorker()
    {
        return worker_;
    }

private:
    Worker *worker_;
};

int main()
{
    Derived derived;
    derived.init();
    
    
    Worker *worker = derived.getWorker();
    worker->breakFunc();
}

Base クラスのオブジェクトは Derived クラスのオブジェクトの親オブジェクト部分にしか存在しませんが、Derived クラスは Base クラスをprivatelyに継承します。つまり、Derived クラスオブジェクトは Base クラスのオブジェクトをprivatelyに持つことになります。

上記のコードは Derived クラスのカプセル化規則に違反していますが、コンパイル時に警告すら出ません。

私の意見では、この状況下では明示的なキャストを使用するか、コンパイル中に警告を出す必要があります。

4

2 に答える 2