人に聞けない痔の悩み、これでスッキリ >>

オーバーライドされている親クラスの関数を呼び出すにはどうしたらよいでしょうか
javaのsuper.func()のように親クラスの種類によらず、同じように記述する方法はありますか

A 回答 (5件)

#3 の「余談その2」のように書いちゃうと, Base のコンストラクタが呼び出せないね. 失敗.



とすると
template <typename Base>
struct DEFINESUPERAs {
typedef Base SUPER;
};

class Derived : public Base, public DEFINESUPERAS<Base> {
// 略
};
のようにするしかないけど, こんなことするくらいならふつうに typedef するかてきとうなマクロ作るよなぁ.

発展させれば
3つ目の親クラスを SUPER<2> で指定する
ことができるとは思うけど, そこまでしたいかなぁ.
    • good
    • 0
この回答へのお礼

回答ありがとうございます

C++言語だとSUPERを使うようなのを考えると、結構めんどくさいことになりそうですね

typedefやusing?も検討しますが、
そもそも親クラスの関数を呼び出さなくて済む構造なども視野に入れてみます

お礼日時:2019/08/19 00:23

No.1です



> No.2の回答の通り言語仕様にないそうです

少し違います。
言語仕様に入れるか判断する際に、他重継承などの問題も含めてtypedefで実現できるので不要と判断されただけです。

例えば、以下のように記載します。

#include <stdio.h>

class A {
public: char func() { return 'A' ;}
};
class B : public A {
typedef A oya;
public: char func() { return oya::func() +1 ;}
};
class C : public B {
typedef B oya;
public: char func() { return oya::func() +1 ;}
};

int main(){
A a;
printf(" %c ",a.func());
B b;
printf(" %c ",b.func());
C c;
printf(" %c ",c.func());
}
    • good
    • 0
この回答へのお礼

返信ありがとうございます

>> No.2の回答の通り言語仕様にないそうです
>少し違います。

これについて「言語仕様にない」ということに対して違うと述べられていますが
回答の残りの部分をみるに、
結局、「言語仕様にはない」ということで理解しました

お礼日時:2019/08/19 00:19

およそそこに書いてある通りです. 補足しておくと, 「単一継承のときには特殊な形で書けるようにする」という言語仕様も選択できるのですが, そうしなかったということになります.



余談その1.
実は Perl でも多重継承ができてしまう. そうすると「SUPER」を使った場合にどのメソッドを使うかという問題が生じるが, これは Perl の仕様でメソッドの検索順序が決まっている.

余談その2.
#1 に書かれているように, 単一継承であれば typedef することによって「擬似的に」同じように書くことができる. で, 例えば
template <typename Base>
struct DEFINESUPERAS : Base {
typedef Base SUPER;
};
というテンプレートを作ってやれば,
class Derived : public DEFINESUPERAS<Base> {
// ここでは Base を SUPER で参照できる
};
のような技も可能だったりする (完全にこれでいいかはわからないけどこんな感じでいけるはず). もっとも, 「本当のクラス名」が必要な場所では使えないので, あくまで「擬似的」でしかないんだけど.
    • good
    • 0
この回答へのお礼

回答ありがとうございます
No.5とまとめて記載します。

お礼日時:2019/08/19 00:21

「親クラスの種類によらず、同じように記述する」ことができると, 逆に「親クラスが複数ある」場合に困る. そのため, 言語仕様には存

在しない.
    • good
    • 0
この回答へのお礼

回答ありがとうございます

>そのため, 言語仕様には存在しない.

以下のものと同じことでしょうか
https://srad.jp/~j3259/journal/399424/
引用:「よく考えてみたら C++ は多重継承してるから名指しするしか方法がない。」

言語仕様にないということが分かりました

お礼日時:2019/08/16 00:10

typedefを使うのが一般的かと。

    • good
    • 1
この回答へのお礼

返信ありがとうございます

No.2の回答の通り言語仕様にないそうです

お礼日時:2019/08/16 00:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング