假设您有以下情况
#include <iostream>
class Animal {
public:
virtual void speak() = 0;
};
class Dog : public Animal {
void speak() { std::cout << "woff!" <<std::endl; }
};
class Cat : public Animal {
void speak() { std::cout << "meow!" <<std::endl; }
};
void makeSpeak(Animal &a) {
a.speak();
}
int main() {
Dog d;
Cat c;
makeSpeak(d);
makeSpeak(c);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,makeSpeak是一个接受通用Animal对象的例程.在这种情况下,Animal非常类似于Java接口,因为它只包含一个纯虚方法.makeSpeak不知道它传递的Animal的性质.它只是发送信号"speak"并留下后期绑定来处理调用哪种方法:Cat :: speak()或Dog :: speak().这意味着,就makeSpeak而言,实际传递哪个子类的知识是无关紧要的.
但是Python呢?让我们看看Python中相同案例的代码.请注意,我尝试尽可能与C++案例尽可能相似:
class Animal(object):
def speak(self):
raise NotImplementedError()
class Dog(Animal):
def speak(self):
print "woff!"
class Cat(Animal):
def …Run Code Online (Sandbox Code Playgroud) Gfortran不会让我编译以下代码,因为nLines并且nIOstts不能像这样初始化; 所以我必须先声明它们然后在代码中添加两行来设置它们所需的初始值.
为什么这样工作?也许因为INTENT(OUT)它更有意义,因为函数将存储数据的变量已经存在(我现在不记得Fortran子程序是否通过引用工作),但对于RESULT变量,它似乎是不必要的.这是编译器特有的还是一般的Fortran特性?
FUNCTION LinesInFile(nUnit,nIOstts) RESULT(nLines)
IMPLICIT NONE
INTEGER,INTENT(IN) :: nUnit
INTEGER,INTENT(OUT) :: nIOstts=0
INTEGER :: nLines=-1
DO WHILE (nIOstts.EQ.0)
READ(UNIT=nUnit,FMT='(A)',nIOstts)
nLines=nLines+1
ENDDO
END FUNCTION
Run Code Online (Sandbox Code Playgroud)