2

采取这个简单的代码:

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

main(){
  B b;
  b.x();
}

我想要的是构建一个抽象类,该类将具有一个函数,该函数将调用一个期望它在派生类中实现的函数

问题是我似乎无法让它工作,编译器说它无法编译,因为它找不到要在 x() 中执行的 foo() 的引用(或类似的东西)基类。这能行吗?谁能给我一个例子?

编辑:似乎它只是在“foo();”时不起作用 在 A 类(基础)的析构函数中......
这让我很困惑。=[

EDIT2:这有多有趣。我刚刚创建了一个 callfoo(){ foo(); 现在它编译好了,但是如果我尝试直接从基类 A 的析构函数中调用纯抽象函数,它会给我错误......很奇怪。有人对此有任何想法吗?o_o

请问有什么帮助吗?

谢谢,
乔纳森

更新

它在析构函数之外工作。现在我只是感到困惑。

尝试将“foo()”放在 A(base) 类的析构函数中,至少对我来说不是编译...

有什么帮助吗?

4

4 回答 4

4

没有什么可以阻止您这样做:

struct A {
    virtual ~A() {}
    virtual void f() = 0;
    virtual void g() { f(); }
};

struct B : A {
    void f() { std::cout << "B::f()" << std::endl; }
};

// ...
A* a = new B;
a->g(); // prints "B::f()"

至于从析构函数(或构造函数)调用纯虚函数:不要!它调用未定义的行为。

§10.4/6

成员函数可以从抽象类的构造函数(或析构函数)中调用;对于从这样的构造函数(或析构函数)创建(或销毁)的对象,直接或间接地对纯虚函数进行虚调用(10.3)的效​​果是未定义的。

于 2010-04-05T00:17:40.563 回答
1

它应该与一些语法修改一起工作。

#include <iostream>

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

class B: public A{ 
    void foo(){ std::cerr << "bingo!" << std::endl; } 
};

int main(){
  B b;
  b.x();
  return 0;
}

$ g++ -Wall -Weffc++ derived.cc 
$ ./a.out 
bingo!

这种技术是完全合法的。

于 2010-04-05T00:15:16.663 回答
1

似乎您正在寻找的是模板方法模式的实现。

您需要使用指针,以便利用多态性(从而避免消息 ... x 不是 B 的成员)

#include <iostream>                                                             

class A{  
  public: 
    virtual void foo() = 0;  
    virtual void x(){ foo(); }
};  
class B: public A{  
        void foo(){ std::cout<<"this is b"<<std::endl; } 
};

int main(){
 A* b= new B();
 b->x();

 return 0;
 }   
于 2010-04-05T00:19:29.417 回答
0

理论上效果一样好,你应该在 B 类的 foo() 中添加一个返回类型

于 2010-04-05T00:21:46.743 回答