来自C ++的背景,这对我来说是一个惊喜。 在C ++中,使虚拟function保密是一个很好的做法。 来自http://www.gotw.ca/publications/mill18.htm :“指导方针2:倾向于将虚拟function私人化”。 我还引用了来自Knights-knaves-protected-and-internal的 Eric Lippert的博客: 私有虚拟方法在C#中是非法的,这让我非常沮丧。 如果有的话,我会完全使用这个function。 我明白,在C#中,您将无法重写派生(但不是嵌套)类中的私有虚拟方法。 这是为什么? 在C ++中,访问说明符与是否可以重写函数无关。
有一次,我确信你不能这样做,但是前几天我正在玩一些代码,似乎是编译和工作的。 我只是想validation我不只是幸运。 一个模板类可以有一个纯虚函数 – 我猜这也意味着只是简单的虚方法对于析构函数也是有效的? template <typename WordType> class DataSource { public: DataSource(); DataSource(DataSource const& other); virtual ~DataSource(); virtual void Put( WordType const* const data, unsigned int const wordCount) = 0; } 我已经尝试过在网上查找它,所有我已经能够find的是,你不能有一个正常的类,如这样的虚拟方法(纯的或其他): class DataSource { public: DataSource(); DataSource(DataSource const& other); virtual ~DataSource(); template <typename WordType> virtual void Put( WordType const* const data, unsigned int […]
假设我们有: Class Base { virtual void f(){g();}; virtual void g(){//Do some Base related code;} }; Class Derived : public Base { virtual void f(){Base::f();}; virtual void g(){//Do some Derived related code}; }; int main() { Base *pBase = new Derived; pBase->f(); return 0; } 哪个g()将从Base::f()调用? Base::g()或Derived::g() ? 谢谢…
在函数前面使用保留字virtual的目的是什么? 如果我想要一个子类重写父函数,我只是声明相同的function,如void draw(){} 。 class Parent { public: void say() { std::cout << "1"; } }; class Child : public Parent { public: void say() { std::cout << "2"; } }; int main() { Child* a = new Child(); a->say(); return 0; } 输出是2。 那么,为什么在say()的头文件中保留字是virtual呢? 谢谢一堆。
据我所知,抽象方法和纯虚函数都不提供任何function……所以我们可以说它们都是同一个东西? 另外,假设一个类(不一定声明为抽象)包含一些实现的方法(不是抽象的或虚拟的),而是包含一个纯虚函数。 这个课是抽象的吗?
所以为了创build文件我使用以下内容: fileHandle = open('fileName', 'w') 然后将内容写入文件,closures文件。 在下一步我处理文件。 在程序结束时,我最终得到一个我需要删除的“物理文件”。 有没有办法编写一个“虚拟”文件,其行为与“物理”文件完全相同(允许以相同方式操作),但在Python运行结束时不存在?
什么是“虚拟”inheritance的含义? 我看到下面的代码,并且在下面的上下文中不理解关键字virtual的含义: class A {}; class B : public virtual A;
编译以下代码时,clang会发出警告: struct Base { virtual void * get(char* e); // virtual void * get(char* e, int index); }; struct Derived: public Base { virtual void * get(char* e, int index); }; 警告是: warning: 'Derived::get' hides overloaded virtual function [-Woverloaded-virtual] (当然这个警告需要启用)。 我不明白为什么。 请注意,在Base中取消注释相同的声明会closures警告。 我的理解是,由于get()函数具有不同的签名,因此不能隐藏。 是铿锵的吗? 为什么? 注意这是在MacOS X上运行最新版本的Xcode。 clang –version Apple LLVM version 5.0 (clang-500.1.74) (based […]
在OOP的一些概念之间我很困惑: virtual , override , new和sealed override 。 任何人都可以解释不同之处 我很清楚,如果要使用派生类方法,可以使用override关键字,以便基类方法将被派生类重写。 但我不确定new sealed override 。
问题如标题所述:将方法/属性标记为虚拟的性能影响是什么? 注意 – 我假设虚拟方法在常见情况下不会被重载; 我通常会在这里和基类一起工作。