对抽象类的限制

时间:2017-10-30 05:18:04

标签: c++ abstract-class

我在抽象类上看this microsoft article。文章说

  

抽象类不能用于:

     

•变量或成员数据
  •参数类型
  •功能返回类型
  •显式转换的类型

如果我理解正确,这句话意味着抽象类类型不能是另一个类的成员,另一个函数的参数或另一个函数的返回类型。

的含义是什么?
  

显式转化的类型

这是否意味着我们不能类似(BaseClass)obj1那样obj1属于另一种类型的东西?如果这种理解为真,那么在将一个对象转换为另一个类时可能是必要的吗?

2 个答案:

答案 0 :(得分:0)

抽象类是一个专门用作基类的类。抽象类包含至少一个纯虚函数。通过在类声明中的虚拟成员函数的声明中使用纯说明符(= 0)来声明纯虚函数。 以下是抽象类的示例:

class AB {
public:
  virtual void f() = 0;
};

函数AB :: f是一个纯虚函数。函数声明不能​​同时具有纯说明符和定义。例如,编译器将不允许以下内容:

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

您不能将抽象类用作参数类型,函数返回类型或显式转换的类型,也不能声明抽象类的对象。但是,您可以声明指向抽象类的指针和引用。以下示例演示了这一点:

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

struct B : A {
  virtual void f() { }
};

// Error:
// Class A is an abstract class
// A g();

// Error:
// Class A is an abstract class
// void h(A);
A& i(A&);

int main() {

// Error:
// Class A is an abstract class
//   A a;

   A* pa;
   B b;

// Error:
// Class A is an abstract class
//   static_cast<A>(b);
}

答案 1 :(得分:0)

这意味着你不能做这样的事情:

func applicationDidEnterBackground(_ application: UIApplication) {

        if((self.imgViewStaticImage) != nil)
        {
            self.imgViewStaticImage?.removeFromSuperview()
        }

        self.imgViewStaticImage = UIImageView(frame: (self.window?.bounds)!)
        self.imgViewStaticImage?.image = UIImage(named: "banner")
        self.window?.addSubview(self.imgViewStaticImage!)
    self.window?.bringSubview(toFront: self.imgViewStaticImage!)

    }

    func applicationWillEnterForeground(_ application: UIApplication) {

        if((self.imgViewStaticImage) != nil)
        {
            self.imgViewStaticImage?.removeFromSuperview()
        }

    }

如果class base { public: virtual void foo() = 0; }; class derived : public base { public: void foo() { } }; int main() { derived pDerived; static_cast<base>(pDerived); // Error } 类不是抽象的,你就可以编译它。